Decompiled source of Shrine of Transmutation v1.1.0

plugins/ShrineOfTransmutation/ShrineOfTransmutation.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
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 Microsoft.CodeAnalysis;
using R2API;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Navigation;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Events;
using UnityEngine.Networking;

[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.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("ShrineOfTransmutation")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+119a0254361d7f81c4553108cee95bd32dc14f3c")]
[assembly: AssemblyProduct("ShrineOfTransmutation")]
[assembly: AssemblyTitle("ShrineOfTransmutation")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.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 ShrineOfTransmutation
{
	internal static class Log
	{
		private static ManualLogSource _logSource;

		internal static void Init(ManualLogSource logSource)
		{
			_logSource = logSource;
		}

		internal static void Debug(object data)
		{
			_logSource.LogDebug(data);
		}

		internal static void Error(object data)
		{
			_logSource.LogError(data);
		}

		internal static void Fatal(object data)
		{
			_logSource.LogFatal(data);
		}

		internal static void Info(object data)
		{
			_logSource.LogInfo(data);
		}

		internal static void Message(object data)
		{
			_logSource.LogMessage(data);
		}

		internal static void Warning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("Xerphy.ShrineOfTransmutation", "ShrineOfTransmutation", "1.1.0")]
	public class ShrineOfTransmutation : BaseUnityPlugin
	{
		public const string PluginGUID = "Xerphy.ShrineOfTransmutation";

		public const string PluginAuthor = "Xerphy";

		public const string PluginName = "ShrineOfTransmutation";

		public const string PluginVersion = "1.1.0";

		private AssetBundle mainAssetBundle;

		private GameObject shrineOfTransmutation;

		private Sprite logo;

		public static ConfigEntry<bool> importantAlert { get; set; }

		public static ConfigEntry<bool> chanceToDestroyItem { get; set; }

		public static ConfigEntry<bool> chanceToDowngradeItem { get; set; }

		public static ConfigEntry<bool> chanceToUpgradeItem { get; set; }

		public static ConfigEntry<bool> canDestroyAtAllTiers { get; set; }

		public void Awake()
		{
			//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Expected O, but got Unknown
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: Unknown result type (might be due to invalid IL or missing references)
			//IL_0207: Unknown result type (might be due to invalid IL or missing references)
			//IL_020e: Expected O, but got Unknown
			//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ca: Expected O, but got Unknown
			//IL_02d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02da: Expected O, but got Unknown
			//IL_02e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f7: Expected O, but got Unknown
			//IL_02fc: Expected O, but got Unknown
			//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0301: Expected O, but got Unknown
			//IL_0307: Unknown result type (might be due to invalid IL or missing references)
			//IL_0311: Expected O, but got Unknown
			//IL_0317: Unknown result type (might be due to invalid IL or missing references)
			//IL_0321: Expected O, but got Unknown
			mainAssetBundle = AssetBundle.LoadFromFile(Assembly.GetExecutingAssembly().Location.Replace("ShrineOfTransmutation.dll", "shrineoftransmutationbundle"));
			shrineOfTransmutation = PrefabAPI.InstantiateClone(mainAssetBundle.LoadAsset<GameObject>("Assets/ShrineOfTransmutation/ShrineOfTransmutationAssets/ShrineOfTransmutation.prefab"), "ShrineOfTransmutationModel");
			logo = mainAssetBundle.LoadAsset<Sprite>("Assets/ShrineOfTransmutation/ShrineOfTransmutationAssets/ShrineOfTransmutationLogo.png");
			Log.Init(((BaseUnityPlugin)this).Logger);
			((Object)shrineOfTransmutation).name = "ShrineOfTransmutation";
			shrineOfTransmutation.AddComponent<NetworkIdentity>();
			PurchaseInteraction val = shrineOfTransmutation.AddComponent<PurchaseInteraction>();
			ShrineOfTransmutationManager shrineOfTransmutationManager = shrineOfTransmutation.AddComponent<ShrineOfTransmutationManager>();
			string colorHexString = ColorCatalog.GetColorHexString((ColorIndex)1);
			string colorHexString2 = ColorCatalog.GetColorHexString((ColorIndex)2);
			string colorHexString3 = ColorCatalog.GetColorHexString((ColorIndex)3);
			val.contextToken = "Use Shrine of Transmutation (<color=#" + colorHexString + ">1 It</color><color=#" + colorHexString2 + ">em</color><color=#" + colorHexString3 + ">(s)</color><style=cIsDamage>)";
			val.NetworkdisplayNameToken = "Shrine of Transmutation (<color=#" + colorHexString + ">1 It</color><color=#" + colorHexString2 + ">em</color><color=#" + colorHexString3 + ">(s)</color><style=cIsDamage>)";
			shrineOfTransmutationManager.purchaseInteraction = val;
			shrineOfTransmutation.GetComponent<Highlight>().targetRenderer = (Renderer)(object)shrineOfTransmutation.GetComponentInChildren<MeshRenderer>();
			((Component)shrineOfTransmutation.transform.GetChild(0)).gameObject.AddComponent<EntityLocator>().entity = shrineOfTransmutation;
			InteractableSpawnCard val2 = ScriptableObject.CreateInstance<InteractableSpawnCard>();
			((Object)val2).name = "iscShrineOfTransmutation";
			((SpawnCard)val2).prefab = shrineOfTransmutation;
			((SpawnCard)val2).sendOverNetwork = true;
			((SpawnCard)val2).hullSize = (HullClassification)1;
			((SpawnCard)val2).nodeGraphType = (GraphType)0;
			((SpawnCard)val2).requiredFlags = (NodeFlags)0;
			((SpawnCard)val2).forbiddenFlags = (NodeFlags)16;
			((SpawnCard)val2).directorCreditCost = 5;
			((SpawnCard)val2).occupyPosition = true;
			val2.orientToFloor = false;
			val2.skipSpawnWhenSacrificeArtifactEnabled = false;
			DirectorCard card = new DirectorCard
			{
				selectionWeight = 10,
				spawnCard = (SpawnCard)(object)val2
			};
			DirectorCardHolder val3 = new DirectorCardHolder
			{
				Card = card,
				InteractableCategory = (InteractableCategory)4
			};
			Helpers.AddNewInteractable(val3);
			importantAlert = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "IMPORTANT", true, "Everyone needs to have the same options for multiplayer. You can change these settings while playing, but don't try that in multiplayer.");
			chanceToDestroyItem = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enable item destruction at tier 1", true, "Toggle for if items should have a chance to be destroyed.");
			canDestroyAtAllTiers = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enable item destruction at all tiers", false, "Toggle for if items should have a chance to be destroyed at all tiers. 'Enable item destruction at tier 1' must be toggled to true for this to work.");
			chanceToDowngradeItem = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enable item downgrading", true, "Toggle for if items should have a chance to be downgraded.");
			chanceToUpgradeItem = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enable item upgrading", true, "Toggle for if items should have a chance to be upgraded.");
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(importantAlert));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(chanceToDestroyItem));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(canDestroyAtAllTiers, new CheckBoxConfig
			{
				checkIfDisabled = new IsDisabledDelegate(Check)
			}));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(chanceToDowngradeItem));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(chanceToUpgradeItem));
			ModSettingsManager.SetModDescription("Shrine that lets you reroll white, green, and red items. With a chance to upgrade them, downgrade them, or even destroy them!");
			ModSettingsManager.SetModIcon(logo);
		}

		private bool Check()
		{
			return !chanceToDestroyItem.Value;
		}
	}
	public class ShrineOfTransmutationManager : NetworkBehaviour
	{
		public PurchaseInteraction purchaseInteraction;

		private GameObject shrineUseEffect = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/ShrineUseEffect.prefab").WaitForCompletion();

		private Xoroshiro128Plus rng;

		public PickupIndex dropPickup;

		public Transform dropTransform;

		public float dropUpVelocityStrength = 20f;

		public float dropForwardVelocityStrength = 2.5f;

		private CostTypeIndex currentCostType;

		private ItemDef takenItem;

		public void Start()
		{
			if (NetworkServer.active && Object.op_Implicit((Object)(object)Run.instance))
			{
				purchaseInteraction.SetAvailable(true);
			}
			purchaseInteraction.ShouldShowOnScanner();
			((UnityEvent<Interactor>)(object)purchaseInteraction.onPurchase).AddListener((UnityAction<Interactor>)OnPurchase);
		}

		public void Awake()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			rng = new Xoroshiro128Plus(Run.instance.treasureRng.nextUlong);
			dropTransform = ((Component)this).transform;
			dropPickup = PickupIndex.none;
			currentCostType = (CostTypeIndex)0;
		}

		[Server]
		public void OnPurchase(Interactor interactor)
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Expected O, but got Unknown
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkServer.active)
			{
				Debug.LogWarning((object)"[Server] function 'ShrineOfTransmutationManager::OnPurchase(RoR2.Interactor)' called on client");
			}
			else if (CanBeAffordedByInteractor(interactor))
			{
				purchaseInteraction.SetAvailable(false);
				EffectManager.SpawnEffect(shrineUseEffect, new EffectData
				{
					origin = ((Component)this).gameObject.transform.position,
					rotation = Quaternion.identity,
					scale = 3f,
					color = Color32.op_Implicit(Color.cyan)
				}, true);
				CharacterBody component = ((Component)interactor).GetComponent<CharacterBody>();
				CostTypeDef val = RandomizeCostType(interactor);
				ItemIndex val2 = (ItemIndex)(-1);
				PayCostResults val3 = val.PayCost(1, interactor, ((Component)this).gameObject, rng, val2);
				CreateItemTakenOrb(component.corePosition, ((Component)this).gameObject, val3.itemsTaken[0]);
				takenItem = ItemCatalog.GetItemDef(val3.itemsTaken[0]);
				((MonoBehaviour)this).StartCoroutine(Delay());
			}
		}

		[Server]
		private IEnumerator Delay()
		{
			yield return (object)new WaitForSeconds(1.5f);
			ItemDrop();
			purchaseInteraction.SetAvailable(true);
		}

		public PickupIndex RollDrop()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Expected O, but got Unknown
			//IL_0881: Unknown result type (might be due to invalid IL or missing references)
			//IL_0882: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_02eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f2: Expected O, but got Unknown
			//IL_033c: 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_0215: Unknown result type (might be due to invalid IL or missing references)
			//IL_0216: Unknown result type (might be due to invalid IL or missing references)
			//IL_021d: Expected O, but got Unknown
			//IL_0267: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Expected O, but got Unknown
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0886: Unknown result type (might be due to invalid IL or missing references)
			//IL_0636: Unknown result type (might be due to invalid IL or missing references)
			//IL_063b: Unknown result type (might be due to invalid IL or missing references)
			//IL_063c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0643: Expected O, but got Unknown
			//IL_068d: Unknown result type (might be due to invalid IL or missing references)
			//IL_039e: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ab: Expected O, but got Unknown
			//IL_03f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_07f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_07fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_07fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0805: Expected O, but got Unknown
			//IL_084f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0560: Unknown result type (might be due to invalid IL or missing references)
			//IL_0565: Unknown result type (might be due to invalid IL or missing references)
			//IL_0566: Unknown result type (might be due to invalid IL or missing references)
			//IL_056d: Expected O, but got Unknown
			//IL_05b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0755: Unknown result type (might be due to invalid IL or missing references)
			//IL_075a: Unknown result type (might be due to invalid IL or missing references)
			//IL_075b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0762: Expected O, but got Unknown
			//IL_07ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_06e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ef: Expected O, but got Unknown
			//IL_04bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ca: Expected O, but got Unknown
			//IL_0514: Unknown result type (might be due to invalid IL or missing references)
			//IL_0450: Unknown result type (might be due to invalid IL or missing references)
			//IL_0457: Expected O, but got Unknown
			int num = rng.RangeInt(1, 1001);
			PickupIndex result = PickupIndex.none;
			int num2 = 50;
			int num3 = 150;
			int num4 = 200;
			int num5 = 100;
			int num6 = 300;
			List<PickupIndex> availableTier1DropList = Run.instance.availableTier1DropList;
			List<PickupIndex> availableTier2DropList = Run.instance.availableTier2DropList;
			List<PickupIndex> availableTier3DropList = Run.instance.availableTier3DropList;
			string colorHexString = ColorCatalog.GetColorHexString((ColorIndex)1);
			string colorHexString2 = ColorCatalog.GetColorHexString((ColorIndex)2);
			string colorHexString3 = ColorCatalog.GetColorHexString((ColorIndex)3);
			if (!ShrineOfTransmutation.chanceToDestroyItem.Value)
			{
				num2 = 0;
			}
			if (!ShrineOfTransmutation.chanceToDowngradeItem.Value)
			{
				num4 = 0;
				num6 = 0;
			}
			if (!ShrineOfTransmutation.chanceToUpgradeItem.Value)
			{
				num3 = 0;
				num5 = 0;
			}
			if (((object)(CostTypeIndex)(ref currentCostType)).Equals((object)(CostTypeIndex)4))
			{
				if (num <= num2)
				{
					SimpleChatMessage val = new SimpleChatMessage();
					val.baseToken = "<style=cEvent><color=#307FFF>Destroyed </color><color=#" + colorHexString + ">" + Language.GetString(takenItem.nameToken) + "</color></style>";
					Chat.SendBroadcastChat((ChatMessageBase)(object)val);
				}
				else if (num >= 1001 - num3)
				{
					result = availableTier2DropList[rng.RangeInt(0, availableTier2DropList.Count)];
					SimpleChatMessage val = new SimpleChatMessage();
					val.baseToken = "<style=cEvent><color=#307FFF>Upgraded </color><color=#" + colorHexString + ">" + Language.GetString(takenItem.nameToken) + "</color><color=#307FFF> to </color><color=#" + colorHexString2 + ">" + Language.GetString(ItemCatalog.GetItemDef(((PickupIndex)(ref result)).itemIndex).nameToken) + "</color></style>";
					Chat.SendBroadcastChat((ChatMessageBase)(object)val);
				}
				else
				{
					result = availableTier1DropList[rng.RangeInt(0, availableTier1DropList.Count)];
					SimpleChatMessage val = new SimpleChatMessage();
					val.baseToken = "<style=cEvent><color=#307FFF>Rerolled </color><color=#" + colorHexString + ">" + Language.GetString(takenItem.nameToken) + "</color><color=#307FFF> to </color><color=#" + colorHexString + ">" + Language.GetString(ItemCatalog.GetItemDef(((PickupIndex)(ref result)).itemIndex).nameToken) + "</color></style>";
					Chat.SendBroadcastChat((ChatMessageBase)(object)val);
				}
			}
			else if (((object)(CostTypeIndex)(ref currentCostType)).Equals((object)(CostTypeIndex)5))
			{
				if (num <= num4)
				{
					result = availableTier1DropList[rng.RangeInt(0, availableTier1DropList.Count)];
					SimpleChatMessage val = new SimpleChatMessage();
					val.baseToken = "<style=cEvent><color=#307FFF>Downgraded </color><color=#" + colorHexString2 + ">" + Language.GetString(takenItem.nameToken) + "</color><color=#307FFF> to </color><color=#" + colorHexString + ">" + Language.GetString(ItemCatalog.GetItemDef(((PickupIndex)(ref result)).itemIndex).nameToken) + "</color></style>";
					Chat.SendBroadcastChat((ChatMessageBase)(object)val);
				}
				else if (num >= 1001 - num5)
				{
					result = availableTier3DropList[rng.RangeInt(0, availableTier3DropList.Count)];
					SimpleChatMessage val = new SimpleChatMessage();
					val.baseToken = "<style=cEvent><color=#307FFF>Upgraded </color><color=#" + colorHexString2 + ">" + Language.GetString(takenItem.nameToken) + "</color><color=#307FFF> to </color><color=#" + colorHexString3 + ">" + Language.GetString(ItemCatalog.GetItemDef(((PickupIndex)(ref result)).itemIndex).nameToken) + "</color></style>";
					Chat.SendBroadcastChat((ChatMessageBase)(object)val);
				}
				else if (ShrineOfTransmutation.canDestroyAtAllTiers.Value)
				{
					if (num <= num4 + num2)
					{
						SimpleChatMessage val = new SimpleChatMessage();
						val.baseToken = "<style=cEvent><color=#307FFF>Destroyed </color><color=#" + colorHexString2 + ">" + Language.GetString(takenItem.nameToken) + "</color></style>";
						Chat.SendBroadcastChat((ChatMessageBase)(object)val);
					}
					else
					{
						result = availableTier2DropList[rng.RangeInt(0, availableTier2DropList.Count)];
						SimpleChatMessage val = new SimpleChatMessage();
						val.baseToken = "<style=cEvent><color=#307FFF>Rerolled </color><color=#" + colorHexString2 + ">" + Language.GetString(takenItem.nameToken) + "</color><color=#307FFF> to </color><color=#" + colorHexString2 + ">" + Language.GetString(ItemCatalog.GetItemDef(((PickupIndex)(ref result)).itemIndex).nameToken) + "</color></style>";
						Chat.SendBroadcastChat((ChatMessageBase)(object)val);
					}
				}
				else
				{
					result = availableTier2DropList[rng.RangeInt(0, availableTier2DropList.Count)];
					SimpleChatMessage val = new SimpleChatMessage();
					val.baseToken = "<style=cEvent><color=#307FFF>Rerolled </color><color=#" + colorHexString2 + ">" + Language.GetString(takenItem.nameToken) + "</color><color=#307FFF> to </color><color=#" + colorHexString2 + ">" + Language.GetString(ItemCatalog.GetItemDef(((PickupIndex)(ref result)).itemIndex).nameToken) + "</color></style>";
					Chat.SendBroadcastChat((ChatMessageBase)(object)val);
				}
			}
			else if (((object)(CostTypeIndex)(ref currentCostType)).Equals((object)(CostTypeIndex)6))
			{
				if (num <= num6)
				{
					result = availableTier2DropList[rng.RangeInt(0, availableTier2DropList.Count)];
					SimpleChatMessage val = new SimpleChatMessage();
					val.baseToken = "<style=cEvent><color=#307FFF>Downgraded </color><color=#" + colorHexString3 + ">" + Language.GetString(takenItem.nameToken) + "</color><color=#307FFF> to </color><color=#" + colorHexString2 + ">" + Language.GetString(ItemCatalog.GetItemDef(((PickupIndex)(ref result)).itemIndex).nameToken) + "</color></style>";
					Chat.SendBroadcastChat((ChatMessageBase)(object)val);
				}
				else if (ShrineOfTransmutation.canDestroyAtAllTiers.Value)
				{
					if (num <= num6 + num2)
					{
						SimpleChatMessage val = new SimpleChatMessage();
						val.baseToken = "<style=cEvent><color=#307FFF>Destroyed </color><color=#" + colorHexString3 + ">" + Language.GetString(takenItem.nameToken) + "</color></style>";
						Chat.SendBroadcastChat((ChatMessageBase)(object)val);
					}
					else
					{
						result = availableTier3DropList[rng.RangeInt(0, availableTier3DropList.Count)];
						SimpleChatMessage val = new SimpleChatMessage();
						val.baseToken = "<style=cEvent><color=#307FFF>Rerolled </color><color=#" + colorHexString3 + ">" + Language.GetString(takenItem.nameToken) + "</color><color=#307FFF> to </color><color=#" + colorHexString3 + ">" + Language.GetString(ItemCatalog.GetItemDef(((PickupIndex)(ref result)).itemIndex).nameToken) + "</color></style>";
						Chat.SendBroadcastChat((ChatMessageBase)(object)val);
					}
				}
				else
				{
					result = availableTier3DropList[rng.RangeInt(0, availableTier3DropList.Count)];
					SimpleChatMessage val = new SimpleChatMessage();
					val.baseToken = "<style=cEvent><color=#307FFF>Rerolled </color><color=#" + colorHexString3 + ">" + Language.GetString(takenItem.nameToken) + "</color><color=#307FFF> to </color><color=#" + colorHexString3 + ">" + Language.GetString(ItemCatalog.GetItemDef(((PickupIndex)(ref result)).itemIndex).nameToken) + "</color></style>";
					Chat.SendBroadcastChat((ChatMessageBase)(object)val);
				}
			}
			return result;
		}

		[Server]
		public void ItemDrop()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: 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_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkServer.active)
			{
				Debug.LogWarning((object)"[Server] function 'System.Void RoR2.ChestBehavior::ItemDrop()' called on client");
			}
			dropPickup = RollDrop();
			if (dropPickup != PickupIndex.none)
			{
				float num = 360f;
				Vector3 val = Vector3.up * dropUpVelocityStrength + dropTransform.forward * dropForwardVelocityStrength;
				Quaternion val2 = Quaternion.AngleAxis(num, Vector3.up);
				PickupDropletController.CreatePickupDroplet(dropPickup, dropTransform.position + Vector3.up * 1.5f, val);
				val = val2 * val;
				dropPickup = PickupIndex.none;
			}
			currentCostType = (CostTypeIndex)0;
		}

		public bool CanBeAffordedByInteractor(Interactor activator)
		{
			if (CostTypeCatalog.GetCostTypeDef((CostTypeIndex)4).IsAffordable(1, activator))
			{
				return true;
			}
			if (CostTypeCatalog.GetCostTypeDef((CostTypeIndex)5).IsAffordable(1, activator))
			{
				return true;
			}
			if (CostTypeCatalog.GetCostTypeDef((CostTypeIndex)6).IsAffordable(1, activator))
			{
				return true;
			}
			return false;
		}

		public CostTypeIndex PickRandomTier(Interactor activator, CostTypeIndex costType)
		{
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: 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_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			bool flag = false;
			bool flag2 = false;
			bool flag3 = false;
			CharacterBody component = ((Component)activator).GetComponent<CharacterBody>();
			int totalItemCountOfTier = component.inventory.GetTotalItemCountOfTier((ItemTier)0);
			int totalItemCountOfTier2 = component.inventory.GetTotalItemCountOfTier((ItemTier)1);
			int totalItemCountOfTier3 = component.inventory.GetTotalItemCountOfTier((ItemTier)2);
			int num = totalItemCountOfTier + totalItemCountOfTier2 + totalItemCountOfTier3;
			if (Object.op_Implicit((Object)(object)component.inventory))
			{
				if (totalItemCountOfTier > 0)
				{
					flag = true;
				}
				if (totalItemCountOfTier2 > 0)
				{
					flag2 = true;
				}
				if (totalItemCountOfTier3 > 0)
				{
					flag3 = true;
				}
				int num2 = rng.RangeInt(0, num);
				if (num2 < totalItemCountOfTier && flag)
				{
					costType = (CostTypeIndex)4;
				}
				else if (num2 >= num - totalItemCountOfTier3 && flag3)
				{
					costType = (CostTypeIndex)6;
				}
				else if (flag2)
				{
					costType = (CostTypeIndex)5;
				}
			}
			return costType;
		}

		public bool CanScrapBeUsed(Interactor activator)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			bool flag = false;
			bool flag2 = false;
			bool flag3 = false;
			bool flag4 = false;
			CharacterBody component = ((Component)activator).GetComponent<CharacterBody>();
			ItemIndex val = ItemCatalog.FindItemIndex("ScrapWhite");
			ItemIndex val2 = ItemCatalog.FindItemIndex("ScrapGreen");
			ItemIndex val3 = ItemCatalog.FindItemIndex("ScrapRed");
			ItemIndex val4 = ItemCatalog.FindItemIndex("RegeneratingScrap");
			if (Object.op_Implicit((Object)(object)component.inventory))
			{
				if (component.inventory.GetItemCount(val) > 0)
				{
					flag = true;
				}
				if (component.inventory.GetItemCount(val2) > 0)
				{
					flag2 = true;
				}
				if (component.inventory.GetItemCount(val3) > 0)
				{
					flag3 = true;
				}
				if (component.inventory.GetItemCount(val4) > 0)
				{
					flag4 = true;
				}
			}
			return flag || flag2 || flag3 || flag4;
		}

		public CostTypeIndex PickRandomScrap(Interactor activator)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: 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_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: 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_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: 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)
			bool flag = false;
			bool flag2 = false;
			bool flag3 = false;
			CharacterBody component = ((Component)activator).GetComponent<CharacterBody>();
			ItemIndex val = ItemCatalog.FindItemIndex("ScrapWhite");
			ItemIndex val2 = ItemCatalog.FindItemIndex("ScrapGreen");
			ItemIndex val3 = ItemCatalog.FindItemIndex("ScrapRed");
			ItemIndex val4 = ItemCatalog.FindItemIndex("RegeneratingScrap");
			int itemCount = component.inventory.GetItemCount(val);
			int itemCount2 = component.inventory.GetItemCount(val2);
			int itemCount3 = component.inventory.GetItemCount(val3);
			int itemCount4 = component.inventory.GetItemCount(val4);
			int num = itemCount + itemCount2 + itemCount3;
			if (Object.op_Implicit((Object)(object)component.inventory))
			{
				if (itemCount > 0)
				{
					flag = true;
				}
				if (itemCount2 > 0)
				{
					flag2 = true;
				}
				if (itemCount3 > 0)
				{
					flag3 = true;
				}
				if (itemCount4 > 0)
				{
					return (CostTypeIndex)5;
				}
				int num2 = rng.RangeInt(0, num);
				if (num2 < itemCount && flag)
				{
					return (CostTypeIndex)4;
				}
				if (num2 >= num - itemCount3 && flag3)
				{
					return (CostTypeIndex)6;
				}
				if (flag2)
				{
					return (CostTypeIndex)5;
				}
				return (CostTypeIndex)0;
			}
			return (CostTypeIndex)0;
		}

		public CostTypeDef RandomizeCostType(Interactor activator)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: 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)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			CostTypeIndex costType = (CostTypeIndex)0;
			return CostTypeCatalog.GetCostTypeDef(currentCostType = ((!CanScrapBeUsed(activator)) ? PickRandomTier(activator, costType) : PickRandomScrap(activator)));
		}

		[Server]
		public static void CreateItemTakenOrb(Vector3 effectOrigin, GameObject targetObject, ItemIndex itemIndex)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Expected I4, but got Unknown
			//IL_0048: Expected O, but got Unknown
			if (!NetworkServer.active)
			{
				Debug.LogWarning((object)"[Server] function 'System.Void RoR2.PurchaseInteraction::CreateItemTakenOrb(UnityEngine.Vector3,UnityEngine.GameObject,RoR2.ItemIndex)' called on client");
				return;
			}
			GameObject val = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/OrbEffects/ItemTakenOrbEffect");
			EffectData val2 = new EffectData
			{
				origin = effectOrigin,
				genericFloat = 1.5f,
				genericUInt = (uint)(itemIndex + 1)
			};
			val2.SetNetworkedObjectReference(targetObject);
			EffectManager.SpawnEffect(val, val2, true);
		}
	}
}