Decompiled source of ImprovedCommandEssence v1.4.5

ImprovedCommandEssence.dll

Decompiled 6 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using EntityStates;
using EntityStates.Scrapper;
using Microsoft.CodeAnalysis;
using On.EntityStates.Scrapper;
using On.RoR2;
using On.RoR2.Artifacts;
using RoR2;
using RoR2.Artifacts;
using UnityEngine;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("ImprovedCommandEssence")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+78aa6b457ebb220eaa0428592846d9319bb08c08")]
[assembly: AssemblyProduct("ImprovedCommandEssence")]
[assembly: AssemblyTitle("ImprovedCommandEssence")]
[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 ImprovedCommandEssence
{
	[BepInPlugin("Cercain.ImprovedCommandEssence", "ImprovedCommandEssence", "1.4.4")]
	public class ImprovedCommandEssence : BaseUnityPlugin
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_OnGenerateInteractableCardSelection <0>__OnGenCommandCards;
		}

		public const string PluginGUID = "Cercain.ImprovedCommandEssence";

		public const string PluginAuthor = "Cercain";

		public const string PluginName = "ImprovedCommandEssence";

		public const string PluginVersion = "1.4.4";

		public static ConfigFile configFile = new ConfigFile(Paths.ConfigPath + "\\ImprovedCommandEssence.cfg", true);

		public static ConfigEntry<int> itemAmountCommon { get; set; }

		public static ConfigEntry<int> itemAmountUncommon { get; set; }

		public static ConfigEntry<int> itemAmountLegendary { get; set; }

		public static ConfigEntry<int> itemAmountLunar { get; set; }

		public static ConfigEntry<int> itemAmountVoid { get; set; }

		public static ConfigEntry<int> itemAmountEquip { get; set; }

		public static ConfigEntry<int> itemAmountAspect { get; set; }

		public static ConfigEntry<int> itemAmountPotential { get; set; }

		public static ConfigEntry<int> itemAmountPotentialCache { get; set; }

		public static ConfigEntry<int> itemAmountBoss { get; set; }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

		public static ConfigEntry<int> essenceChance { get; set; }

		public static ConfigEntry<string> customCompatibility { get; set; }

		private void ConfigOnSettingChanged(object sender, SettingChangedEventArgs e)
		{
			if (itemAmountCommon.Value <= 0)
			{
				itemAmountCommon.Value = 1;
			}
			if (itemAmountUncommon.Value <= 0)
			{
				itemAmountUncommon.Value = 1;
			}
			if (itemAmountLegendary.Value <= 0)
			{
				itemAmountLegendary.Value = 1;
			}
			if (itemAmountLunar.Value <= 0)
			{
				itemAmountLunar.Value = 1;
			}
			if (itemAmountVoid.Value <= 0)
			{
				itemAmountVoid.Value = 1;
			}
			if (itemAmountEquip.Value <= 0)
			{
				itemAmountEquip.Value = 1;
			}
			if (essenceChance.Value > 100)
			{
				essenceChance.Value = 100;
			}
			if (essenceChance.Value < 0)
			{
				essenceChance.Value = 0;
			}
		}

		public void OnEnable()
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected O, but got Unknown
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Expected O, but got Unknown
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Expected O, but got Unknown
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Expected O, but got Unknown
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Expected O, but got Unknown
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Expected O, but got Unknown
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Expected O, but got Unknown
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Expected O, but got Unknown
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Expected O, but got Unknown
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Expected O, but got Unknown
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Expected O, but got Unknown
			//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f4: Expected O, but got Unknown
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_021e: Expected O, but got Unknown
			//IL_023e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0248: Expected O, but got Unknown
			//IL_0268: Unknown result type (might be due to invalid IL or missing references)
			//IL_0272: Expected O, but got Unknown
			//IL_0292: Unknown result type (might be due to invalid IL or missing references)
			//IL_029c: Expected O, but got Unknown
			//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c6: Expected O, but got Unknown
			//IL_02e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f0: Expected O, but got Unknown
			//IL_0310: Unknown result type (might be due to invalid IL or missing references)
			//IL_031a: Expected O, but got Unknown
			//IL_033a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0344: Expected O, but got Unknown
			//IL_0364: Unknown result type (might be due to invalid IL or missing references)
			//IL_036e: Expected O, but got Unknown
			//IL_038e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0398: Expected O, but got Unknown
			//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c2: Expected O, but got Unknown
			//IL_03e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ec: Expected O, but got Unknown
			//IL_040c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0416: Expected O, but got Unknown
			//IL_0436: Unknown result type (might be due to invalid IL or missing references)
			//IL_0440: Expected O, but got Unknown
			//IL_0463: Unknown result type (might be due to invalid IL or missing references)
			//IL_046d: Expected O, but got Unknown
			//IL_0474: Unknown result type (might be due to invalid IL or missing references)
			//IL_047e: Expected O, but got Unknown
			//IL_0485: Unknown result type (might be due to invalid IL or missing references)
			//IL_048f: Expected O, but got Unknown
			//IL_0496: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a0: Expected O, but got Unknown
			//IL_04b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_04bd: Expected O, but got Unknown
			//IL_04d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04da: Expected O, but got Unknown
			//IL_04ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_04f7: Expected O, but got Unknown
			//IL_052b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0530: Unknown result type (might be due to invalid IL or missing references)
			//IL_0536: Expected O, but got Unknown
			//IL_054e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0558: Expected O, but got Unknown
			//IL_057c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0586: Expected O, but got Unknown
			//IL_056b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0575: Expected O, but got Unknown
			itemAmountCommon = configFile.Bind<int>("ImprovedCommandEssence", "itemAmountCommon", 6, new ConfigDescription("Set the amount of Common (white) options shown when opening White Command Essences.", (AcceptableValueBase)null, Array.Empty<object>()));
			itemAmountUncommon = configFile.Bind<int>("ImprovedCommandEssence", "itemAmountUncommon", 4, new ConfigDescription("Set the amount of Uncommon (Green) options shown when opening Green Command Essences.", (AcceptableValueBase)null, Array.Empty<object>()));
			itemAmountLegendary = configFile.Bind<int>("ImprovedCommandEssence", "itemAmountLegendary", 2, new ConfigDescription("Set the amount of Legendary (Red) options shown when opening Red Command Essences.", (AcceptableValueBase)null, Array.Empty<object>()));
			itemAmountBoss = configFile.Bind<int>("ImprovedCommandEssence", "itemAmountBoss", 2, new ConfigDescription("Set the amount of Boss (Yellow) items shown when opening Yellow Command Essences with 'onForYellowBossDrops' set to true.", (AcceptableValueBase)null, Array.Empty<object>()));
			itemAmountLunar = configFile.Bind<int>("ImprovedCommandEssence", "itemAmountLunar", 2, new ConfigDescription("Set the amount of Blue items shown when opening Lunar Command Essences.", (AcceptableValueBase)null, Array.Empty<object>()));
			itemAmountVoid = configFile.Bind<int>("ImprovedCommandEssence", "itemAmountVoid", 2, new ConfigDescription("Set the amount of Blue items shown when opening Void Command Essences.", (AcceptableValueBase)null, Array.Empty<object>()));
			itemAmountEquip = configFile.Bind<int>("ImprovedCommandEssence", "itemAmountEquip", 4, new ConfigDescription("Set the amount of Orange items shown when opening Equiptment Command Essences.", (AcceptableValueBase)null, Array.Empty<object>()));
			itemAmountAspect = configFile.Bind<int>("ImprovedCommandEssence", "itemAmountAspect", 2, new ConfigDescription("Set the amount of Aspect items shown when opening Aspect Command Essences.", (AcceptableValueBase)null, Array.Empty<object>()));
			itemAmountPotential = configFile.Bind<int>("ImprovedCommandEssence", "itemAmountPotential", 6, new ConfigDescription("Set the amount of items shown when opening a Void Potential from a Void Cache.", (AcceptableValueBase)null, Array.Empty<object>()));
			itemAmountPotentialCache = configFile.Bind<int>("ImprovedCommandEssence", "itemAmountPotentialCache", 4, new ConfigDescription("Set the amount of items shown when opening a Void Potential from a Void Triple.", (AcceptableValueBase)null, Array.Empty<object>()));
			essenceChance = configFile.Bind<int>("ImprovedCommandEssence", "essenceChance", 100, new ConfigDescription("Set the chance for item drops to drop as a Command Essence (0-100) from non-explicit chests", (AcceptableValueBase)null, Array.Empty<object>()));
			keepCategory = configFile.Bind<bool>("ImprovedCommandEssence", "keepCategory", true, new ConfigDescription("Set if category chests only show items of the corresponding category.", (AcceptableValueBase)null, Array.Empty<object>()));
			onInBazaar = configFile.Bind<bool>("ImprovedCommandEssence", "onInBazaar", false, new ConfigDescription("Set if the Command Artifact is turn on in the Bazaar.", (AcceptableValueBase)null, Array.Empty<object>()));
			onInDropShip = configFile.Bind<bool>("ImprovedCommandEssence", "onInDropShip", false, new ConfigDescription("Set if the Command Artifact is turn on for Drop Ship items.", (AcceptableValueBase)null, Array.Empty<object>()));
			onForHidden = configFile.Bind<bool>("ImprovedCommandEssence", "onForHidden", true, new ConfigDescription("When 'onInDropShip' is false, set if hidden (?) items drop as a Command Essence or the hidden item.", (AcceptableValueBase)null, Array.Empty<object>()));
			onForAdaptive = configFile.Bind<bool>("ImprovedCommandEssence", "onForAdaptive", false, new ConfigDescription("Set if Adaptive Chests will drop a Command Essense (true) or their item (false).", (AcceptableValueBase)null, Array.Empty<object>()));
			onForYellowBossDrops = configFile.Bind<bool>("ImprovedCommandEssence", "onForYellowBossDrops", true, new ConfigDescription("Set if boss items dropped by the teleporter event will drop a Command Essence (true) or their item (false).", (AcceptableValueBase)null, Array.Empty<object>()));
			onForPotential = configFile.Bind<bool>("ImprovedCommandEssence", "onForPotential", false, new ConfigDescription("Set if the Command Artifact is turn on for Void Potentials and Void Caches.", (AcceptableValueBase)null, Array.Empty<object>()));
			onForDelusion = configFile.Bind<bool>("ImprovedCommandEssence", "onForDelusion", false, new ConfigDescription("Set if the items dropped by the Delusion artifact drop as their item or a Command Essence.", (AcceptableValueBase)null, Array.Empty<object>()));
			onForAspect = configFile.Bind<bool>("ImprovedCommandEssence", "onForAspect", false, new ConfigDescription("Set if the Aspects dropped by Elites drop as their item or a Command Essence.", (AcceptableValueBase)null, Array.Empty<object>()));
			sameBossDrops = configFile.Bind<bool>("ImprovedCommandEssence", "sameBossDrops", true, new ConfigDescription("Set if the Command Essences that drop from the Teleporter boss give the same options.", (AcceptableValueBase)null, Array.Empty<object>()));
			onForTrophy = configFile.Bind<bool>("ImprovedCommandEssence", "onForTrophy", false, new ConfigDescription("Set if the item dropped by bosses killed via Trophy Hunter's Tricorn drop as a Command Essence (true) or the boss item (false)", (AcceptableValueBase)null, Array.Empty<object>()));
			enableScrappers = configFile.Bind<bool>("ImprovedCommandEssence", "enableScrappers", false, new ConfigDescription("Set if Scrappers spawn", (AcceptableValueBase)null, Array.Empty<object>()));
			enablePrinters = configFile.Bind<bool>("ImprovedCommandEssence", "enablePrinters", false, new ConfigDescription("Set if Printers spawn (onInDropShip must be on to drop as the item)", (AcceptableValueBase)null, Array.Empty<object>()));
			enableMultishops = configFile.Bind<bool>("ImprovedCommandEssence", "enableTerminals", false, new ConfigDescription("Set if Multishops spawn (onInDropShip must be on to drop as the item)", (AcceptableValueBase)null, Array.Empty<object>()));
			scrappersDropEssence = configFile.Bind<bool>("ImprovedCommandEssence", "scrappersDropEssence", false, new ConfigDescription("Set if Scrappers drop scrap (false) or Command Essence (true)", (AcceptableValueBase)null, Array.Empty<object>()));
			((BaseUnityPlugin)this).Config.SettingChanged += ConfigOnSettingChanged;
			PickupPickerController.SetOptionsFromPickupForCommandArtifact += new hook_SetOptionsFromPickupForCommandArtifact(SetOptions);
			ChestBehavior.BaseItemDrop += new hook_BaseItemDrop(BaseItemDrop);
			PickupDropletController.OnCollisionEnter += new hook_OnCollisionEnter(DropletCollisionEnter);
			BossGroup.DropRewards += new hook_DropRewards(BossGroupDropRewards);
			if (!onInDropShip.Value)
			{
				ShopTerminalBehavior.DropPickup += new hook_DropPickup(TerminalDrop);
			}
			if (!onForAdaptive.Value)
			{
				RouletteChestController.EjectPickupServer += new hook_EjectPickupServer(RouletteEject);
			}
			if (!onForTrophy.Value)
			{
				EquipmentSlot.FireBossHunter += new hook_FireBossHunter(BossHunterDrop);
			}
			if (enableScrappers.Value || enableMultishops.Value || enablePrinters.Value)
			{
				object obj = <>O.<0>__OnGenCommandCards;
				if (obj == null)
				{
					hook_OnGenerateInteractableCardSelection val = OnGenCommandCards;
					<>O.<0>__OnGenCommandCards = val;
					obj = (object)val;
				}
				CommandArtifactManager.OnGenerateInteractableCardSelection += (hook_OnGenerateInteractableCardSelection)obj;
			}
			if (!scrappersDropEssence.Value)
			{
				ScrappingToIdle.OnEnter += new hook_OnEnter(ScrapperDrop);
			}
			if (!onForPotential.Value)
			{
				OptionChestBehavior.Roll += new hook_Roll(PotentialRoll);
			}
			OptionChestBehavior.ItemDrop += new hook_ItemDrop(OptionItemDrop);
		}

		[Server]
		public void PotentialRoll(orig_Roll orig, OptionChestBehavior self)
		{
			if (!RunArtifactManager.instance.IsArtifactEnabled(Artifacts.commandArtifactDef))
			{
				orig.Invoke(self);
			}
			else if (!NetworkServer.active)
			{
				Debug.LogWarning((object)"[Server] function 'System.Void RoR2.OptionChestBehavior::Roll()' called on client");
			}
			else if (((Component)self).gameObject.GetComponent<GenericDisplayNameProvider>().displayToken == "LOCKBOXVOID_NAME")
			{
				self.generatedDrops = self.dropTable.GenerateUniqueDrops(itemAmountPotentialCache.Value, self.rng);
			}
			else
			{
				self.generatedDrops = self.dropTable.GenerateUniqueDrops(itemAmountPotential.Value, self.rng);
			}
		}

		[Server]
		public void OptionItemDrop(orig_ItemDrop orig, OptionChestBehavior self)
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: 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_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: 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_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			if (!RunArtifactManager.instance.IsArtifactEnabled(Artifacts.commandArtifactDef))
			{
				orig.Invoke(self);
			}
			else if (!NetworkServer.active)
			{
				Debug.LogWarning((object)"[Server] function 'System.Void RoR2.OptionChestBehavior::ItemDrop()' called on client");
			}
			else if (self.generatedDrops != null && self.generatedDrops.Length != 0)
			{
				TrackBehaviour track = new TrackBehaviour
				{
					PickupSource = PickupSource.VoidPotential
				};
				CreatePickupInfo pickupInfo = new CreatePickupInfo
				{
					pickerOptions = PickupPickerController.GenerateOptionsFromArray(self.generatedDrops),
					prefabOverride = self.pickupPrefab,
					position = self.dropTransform.position,
					rotation = Quaternion.identity
				};
				((CreatePickupInfo)(ref pickupInfo)).pickupIndex = PickupCatalog.FindPickupIndex(self.displayTier);
				CreatePickupDroplet(pickupInfo, Vector3.up * self.dropUpVelocityStrength + self.dropTransform.forward * self.dropForwardVelocityStrength, track);
				self.generatedDrops = null;
			}
		}

		private bool BossHunterDrop(orig_FireBossHunter orig, EquipmentSlot self)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: 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_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: 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_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0264: Expected O, but got Unknown
			//IL_0273: Unknown result type (might be due to invalid IL or missing references)
			//IL_0275: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0284: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02be: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cb: Expected O, but got Unknown
			//IL_031d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0457: Unknown result type (might be due to invalid IL or missing references)
			//IL_0461: Unknown result type (might be due to invalid IL or missing references)
			//IL_047c: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_03db: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_0402: Expected O, but got Unknown
			//IL_0359: Unknown result type (might be due to invalid IL or missing references)
			//IL_035e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0366: Unknown result type (might be due to invalid IL or missing references)
			//IL_0370: Unknown result type (might be due to invalid IL or missing references)
			//IL_0378: Unknown result type (might be due to invalid IL or missing references)
			//IL_037d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0382: Unknown result type (might be due to invalid IL or missing references)
			//IL_038a: Unknown result type (might be due to invalid IL or missing references)
			//IL_039f: Expected O, but got Unknown
			if (!RunArtifactManager.instance.IsArtifactEnabled(Artifacts.commandArtifactDef))
			{
				return orig.Invoke(self);
			}
			self.UpdateTargets(Equipment.BossHunter.equipmentIndex, true);
			HurtBox hurtBox = self.currentTarget.hurtBox;
			DeathRewards val;
			if ((Object)(object)hurtBox == (Object)null)
			{
				val = null;
			}
			else
			{
				HealthComponent healthComponent = hurtBox.healthComponent;
				if ((Object)(object)healthComponent == (Object)null)
				{
					val = null;
				}
				else
				{
					CharacterBody body = healthComponent.body;
					if ((Object)(object)body == (Object)null)
					{
						val = null;
					}
					else
					{
						GameObject gameObject = ((Component)body).gameObject;
						val = (((Object)(object)gameObject != (Object)null) ? gameObject.GetComponent<DeathRewards>() : null);
					}
				}
			}
			DeathRewards val2 = val;
			if (Object.op_Implicit((Object)(object)hurtBox) && Object.op_Implicit((Object)(object)val2))
			{
				TrackBehaviour trackBehaviour = new TrackBehaviour();
				trackBehaviour.ItemTag = (ItemTag)0;
				trackBehaviour.PickupSource = PickupSource.BossHunter;
				CharacterBody body2 = hurtBox.healthComponent.body;
				Vector3 val3 = (Object.op_Implicit((Object)(object)body2) ? body2.corePosition : Vector3.zero);
				Vector3 val4 = val3 - self.characterBody.corePosition;
				Vector3 normalized = ((Vector3)(ref val4)).normalized;
				CreatePickupDroplet(val2.bossDropTable.GenerateDrop(self.rng), val3, normalized * 15f, trackBehaviour);
				Object val5;
				if ((Object)(object)hurtBox == (Object)null)
				{
					val5 = null;
				}
				else
				{
					HealthComponent healthComponent2 = hurtBox.healthComponent;
					if ((Object)(object)healthComponent2 == (Object)null)
					{
						val5 = null;
					}
					else
					{
						CharacterBody body3 = healthComponent2.body;
						val5 = (Object)(object)(((Object)(object)body3 != (Object)null) ? body3.master : null);
					}
				}
				if (Object.op_Implicit(val5))
				{
					hurtBox.healthComponent.body.master.TrueKill(((Component)this).gameObject, (GameObject)null, (DamageType)0);
				}
				CharacterModel component = ((Component)hurtBox.hurtBoxGroup).GetComponent<CharacterModel>();
				if (Object.op_Implicit((Object)(object)component))
				{
					TemporaryOverlay obj = ((Component)component).gameObject.AddComponent<TemporaryOverlay>();
					obj.duration = 0.1f;
					obj.animateShaderAlpha = true;
					obj.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
					obj.destroyComponentOnEnd = true;
					obj.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matHuntressFlashBright");
					obj.AddToCharacerModel(component);
					TemporaryOverlay obj2 = ((Component)component).gameObject.AddComponent<TemporaryOverlay>();
					obj2.duration = 1.2f;
					obj2.animateShaderAlpha = true;
					obj2.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f);
					obj2.destroyComponentOnEnd = true;
					obj2.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matGhostEffect");
					obj2.AddToCharacerModel(component);
				}
				DamageInfo val6 = new DamageInfo();
				val6.attacker = ((Component)this).gameObject;
				val6.force = -normalized * 2500f;
				self.healthComponent.TakeDamageForce(val6, true, false);
				GameObject obj3 = LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/BossHunterKillEffect");
				Quaternion rotation = Util.QuaternionSafeLookRotation(normalized, Vector3.up);
				EffectManager.SpawnEffect(obj3, new EffectData
				{
					origin = val3,
					rotation = rotation
				}, true);
				ModelLocator component2 = ((Component)this).gameObject.GetComponent<ModelLocator>();
				CharacterModel val7;
				if ((Object)(object)component2 == (Object)null)
				{
					val7 = null;
				}
				else
				{
					Transform modelTransform = component2.modelTransform;
					val7 = (((Object)(object)modelTransform != (Object)null) ? ((Component)modelTransform).GetComponent<CharacterModel>() : null);
				}
				CharacterModel val8 = val7;
				if (Object.op_Implicit((Object)(object)val8))
				{
					foreach (GameObject equipmentDisplayObject in val8.GetEquipmentDisplayObjects(Equipment.BossHunter.equipmentIndex))
					{
						if (((Object)equipmentDisplayObject).name.Contains("DisplayTricorn"))
						{
							EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/BossHunterHatEffect"), new EffectData
							{
								origin = equipmentDisplayObject.transform.position,
								rotation = equipmentDisplayObject.transform.rotation,
								scale = equipmentDisplayObject.transform.localScale.x
							}, true);
						}
						else
						{
							EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/BossHunterGunEffect"), new EffectData
							{
								origin = equipmentDisplayObject.transform.position,
								rotation = Util.QuaternionSafeLookRotation(val3 - equipmentDisplayObject.transform.position, Vector3.up),
								scale = equipmentDisplayObject.transform.localScale.x
							}, true);
						}
					}
				}
				CharacterBody characterBody = self.characterBody;
				if (Object.op_Implicit((Object)(object)(((Object)(object)characterBody != (Object)null) ? characterBody.inventory : null)))
				{
					CharacterMasterNotificationQueue.PushEquipmentTransformNotification(self.characterBody.master, self.characterBody.inventory.currentEquipmentIndex, Equipment.BossHunterConsumed.equipmentIndex, (TransformationType)0);
					self.characterBody.inventory.SetEquipmentIndex(Equipment.BossHunterConsumed.equipmentIndex);
				}
				self.InvalidateCurrentTarget();
				return true;
			}
			return false;
		}

		private void BossGroupDropRewards(orig_DropRewards orig, BossGroup self)
		{
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: 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_00b4: 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_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0184: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_019d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_0217: Unknown result type (might be due to invalid IL or missing references)
			//IL_0218: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ca: 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)
			//IL_03db: Unknown result type (might be due to invalid IL or missing references)
			//IL_03dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_029e: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_037b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0388: Unknown result type (might be due to invalid IL or missing references)
			//IL_0396: Unknown result type (might be due to invalid IL or missing references)
			//IL_0398: Unknown result type (might be due to invalid IL or missing references)
			//IL_039d: Unknown result type (might be due to invalid IL or missing references)
			//IL_039f: Unknown result type (might be due to invalid IL or missing references)
			//IL_032c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
			if (!RunArtifactManager.instance.IsArtifactEnabled(Artifacts.commandArtifactDef))
			{
				orig.Invoke(self);
				return;
			}
			if (!Object.op_Implicit((Object)(object)Run.instance))
			{
				Debug.LogError((object)"No valid run instance!");
				return;
			}
			if (self.rng == null)
			{
				Debug.LogError((object)"RNG is null!");
				return;
			}
			int participatingPlayerCount = Run.instance.participatingPlayerCount;
			if (participatingPlayerCount == 0)
			{
				return;
			}
			if (Object.op_Implicit((Object)(object)self.dropPosition))
			{
				PickupIndex none = PickupIndex.none;
				Option[] optionsFromPickupIndex;
				if (Object.op_Implicit((Object)(object)self.dropTable))
				{
					none = self.dropTable.GenerateDrop(self.rng);
					optionsFromPickupIndex = PickupPickerController.GetOptionsFromPickupIndex(none);
				}
				else
				{
					List<PickupIndex> list = Run.instance.availableTier2DropList;
					if (self.forceTier3Reward)
					{
						list = Run.instance.availableTier3DropList;
					}
					none = self.rng.NextElementUniform<PickupIndex>(list);
					optionsFromPickupIndex = PickupPickerController.GetOptionsFromPickupIndex(none);
				}
				int itemAmountFromTier = GetItemAmountFromTier(((PickupIndex)(ref optionsFromPickupIndex[0].pickupIndex)).pickupDef);
				optionsFromPickupIndex = (from x in optionsFromPickupIndex.ToList()
					orderby self.rng.Next()
					select x).Take(itemAmountFromTier).ToArray();
				int num = 1 + self.bonusRewardCount;
				if (self.scaleRewardsByPlayerCount)
				{
					num *= participatingPlayerCount;
				}
				float num2 = 360f / (float)num;
				Vector3 val = Quaternion.AngleAxis((float)Random.Range(0, 360), Vector3.up) * (Vector3.up * 40f + Vector3.forward * 5f);
				Quaternion val2 = Quaternion.AngleAxis(num2, Vector3.up);
				bool flag = self.bossDrops != null && self.bossDrops.Count > 0;
				bool flag2 = self.bossDropTables != null && self.bossDropTables.Count > 0;
				int num3 = 0;
				Option[] array = null;
				while (num3 < num)
				{
					TrackBehaviour trackBehaviour = new TrackBehaviour();
					trackBehaviour.PickupSource = PickupSource.Boss;
					Option[] options = optionsFromPickupIndex;
					PickupIndex val3 = none;
					if (self.bossDrops != null && (flag || flag2) && self.rng.nextNormalizedFloat <= self.bossDropChance)
					{
						trackBehaviour.PickupSource = PickupSource.YellowBoss;
						Debug.Log((object)"Generated Boss Rewards");
						if (flag2)
						{
							PickupDropTable val4 = self.rng.NextElementUniform<PickupDropTable>(self.bossDropTables);
							if ((Object)(object)val4 != (Object)null)
							{
								val3 = val4.GenerateDrop(self.rng);
							}
						}
						else
						{
							val3 = self.rng.NextElementUniform<PickupIndex>(self.bossDrops);
						}
						if (onForYellowBossDrops.Value)
						{
							if (sameBossDrops.Value)
							{
								if (array == null)
								{
									array = (from x in PickupPickerController.GetOptionsFromPickupIndex(val3)
										orderby self.rng.Next()
										select x).Take(itemAmountBoss.Value).ToArray();
								}
								options = array;
							}
							else
							{
								options = (from x in PickupPickerController.GetOptionsFromPickupIndex(val3)
									orderby self.rng.Next()
									select x).Take(itemAmountBoss.Value).ToArray();
							}
						}
						else
						{
							options = (Option[])(object)new Option[1]
							{
								new Option
								{
									available = Run.instance.IsPickupAvailable(val3),
									pickupIndex = val3
								}
							};
						}
					}
					trackBehaviour.ItemTag = (ItemTag)0;
					trackBehaviour.Options = options;
					CreatePickupDroplet(val3, self.dropPosition.position, val, trackBehaviour);
					num3++;
					val = val2 * val;
				}
			}
			else
			{
				Debug.LogWarning((object)"dropPosition not set for BossGroup! No item will be spawned.");
			}
		}

		private static void OnGenCommandCards(orig_OnGenerateInteractableCardSelection orig, SceneDirector sceneDirector, DirectorCardCategorySelection dccs)
		{
			dccs.RemoveCardsThatFailFilter((Predicate<DirectorCard>)CheckCardsFilter);
		}

		private static bool CheckCardsFilter(DirectorCard card)
		{
			GameObject prefab = card.spawnCard.prefab;
			if (!enableMultishops.Value && Object.op_Implicit((Object)(object)prefab.GetComponent<MultiShopController>()))
			{
				return false;
			}
			if (!enableScrappers.Value && Object.op_Implicit((Object)(object)prefab.GetComponent<ScrapperController>()))
			{
				return false;
			}
			if (!enablePrinters.Value && Object.op_Implicit((Object)(object)prefab.GetComponent<ShopTerminalBehavior>()))
			{
				return false;
			}
			return true;
		}

		private void ScrapperDrop(orig_OnEnter orig, ScrappingToIdle self)
		{
			//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_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Expected I4, but got Unknown
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: 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_01b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: 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)
			//IL_0163: Unknown result type (might be due to invalid IL or missing references)
			if (!RunArtifactManager.instance.IsArtifactEnabled(Artifacts.commandArtifactDef))
			{
				orig.Invoke(self);
				return;
			}
			if (Object.op_Implicit((Object)(object)((EntityState)self).characterBody))
			{
				((BaseState)self).attackSpeedStat = ((EntityState)self).characterBody.attackSpeed;
				((BaseState)self).damageStat = ((EntityState)self).characterBody.damage;
				((BaseState)self).critStat = ((EntityState)self).characterBody.crit;
				((BaseState)self).moveSpeedStat = ((EntityState)self).characterBody.moveSpeed;
			}
			((ScrapperBaseState)self).pickupPickerController = ((EntityState)self).GetComponent<PickupPickerController>();
			((ScrapperBaseState)self).scrapperController = ((EntityState)self).GetComponent<ScrapperController>();
			((ScrapperBaseState)self).pickupPickerController.SetAvailable(((ScrapperBaseState)self).enableInteraction);
			Util.PlaySound(ScrappingToIdle.enterSoundString, ((EntityState)self).gameObject);
			((EntityState)self).PlayAnimation("Base", "ScrappingToIdle", "Scrapping.playbackRate", ScrappingToIdle.duration);
			if (Object.op_Implicit((Object)(object)ScrappingToIdle.muzzleflashEffectPrefab))
			{
				EffectManager.SimpleMuzzleFlash(ScrappingToIdle.muzzleflashEffectPrefab, ((EntityState)self).gameObject, ScrappingToIdle.muzzleString, false);
			}
			if (!NetworkServer.active)
			{
				return;
			}
			self.foundValidScrap = false;
			PickupIndex val = PickupIndex.none;
			ItemDef itemDef = ItemCatalog.GetItemDef(((ScrapperBaseState)self).scrapperController.lastScrappedItemIndex);
			if ((Object)(object)itemDef != (Object)null)
			{
				ItemTier tier = itemDef.tier;
				switch ((int)tier)
				{
				case 0:
					val = PickupCatalog.FindPickupIndex("ItemIndex.ScrapWhite");
					break;
				case 1:
					val = PickupCatalog.FindPickupIndex("ItemIndex.ScrapGreen");
					break;
				case 2:
					val = PickupCatalog.FindPickupIndex("ItemIndex.ScrapRed");
					break;
				case 4:
					val = PickupCatalog.FindPickupIndex("ItemIndex.ScrapYellow");
					break;
				}
			}
			if (val != PickupIndex.none)
			{
				self.foundValidScrap = true;
				Transform val2 = ((BaseState)self).FindModelChild(ScrappingToIdle.muzzleString);
				TrackBehaviour trackBehaviour = new TrackBehaviour();
				trackBehaviour.PickupSource = PickupSource.Scrapper;
				CreatePickupDroplet(val, val2.position, Vector3.up * ScrappingToIdle.dropUpVelocityStrength + val2.forward * ScrappingToIdle.dropForwardVelocityStrength, trackBehaviour);
				ScrapperController scrapperController = ((ScrapperBaseState)self).scrapperController;
				int itemsEaten = scrapperController.itemsEaten;
				scrapperController.itemsEaten = itemsEaten - 1;
			}
		}

		private void RouletteEject(orig_EjectPickupServer orig, RouletteChestController self, PickupIndex pickupIndex)
		{
			//IL_001a: 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_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: 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_0053: Unknown result type (might be due to invalid IL or missing references)
			if (!RunArtifactManager.instance.IsArtifactEnabled(Artifacts.commandArtifactDef))
			{
				orig.Invoke(self, pickupIndex);
			}
			else if (!(pickupIndex == PickupIndex.none))
			{
				TrackBehaviour trackBehaviour = new TrackBehaviour();
				trackBehaviour.PickupSource = PickupSource.Roulette;
				CreatePickupDroplet(pickupIndex, self.ejectionTransform.position, self.ejectionTransform.rotation * self.localEjectionVelocity, trackBehaviour);
			}
		}

		[Server]
		public void BaseItemDrop(orig_BaseItemDrop orig, ChestBehavior self)
		{
			//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_004a: 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)
			//IL_0060: 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_0075: 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_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: 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_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: 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_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: 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)
			if (!RunArtifactManager.instance.IsArtifactEnabled(Artifacts.commandArtifactDef))
			{
				orig.Invoke(self);
			}
			else if (NetworkServer.active && !(self.dropPickup == PickupIndex.none) && self.dropCount >= 1)
			{
				float num = 360f / (float)self.dropCount;
				Vector3 val = Vector3.up * self.dropUpVelocityStrength + self.dropTransform.forward * self.dropForwardVelocityStrength;
				Quaternion val2 = Quaternion.AngleAxis(num, Vector3.up);
				TrackBehaviour track = new TrackBehaviour
				{
					ItemTag = self.requiredItemTag,
					DropTable = self.dropTable,
					PickupSource = PickupSource.Chest
				};
				for (int i = 0; i < self.dropCount; i++)
				{
					CreatePickupInfo pickupInfo = default(CreatePickupInfo);
					((CreatePickupInfo)(ref pickupInfo)).pickupIndex = self.dropPickup;
					pickupInfo.position = self.dropTransform.position + Vector3.up * 1.5f;
					pickupInfo.chest = self;
					pickupInfo.artifactFlag = (PickupArtifactFlag)(self.isCommandChest ? 1 : 0);
					CreatePickupDroplet(pickupInfo, val, track);
					val = val2 * val;
				}
				self.dropPickup = PickupIndex.none;
			}
		}

		[Server]
		private void TerminalDrop(orig_DropPickup orig, ShopTerminalBehavior self)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: 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)
			if (!RunArtifactManager.instance.IsArtifactEnabled(Artifacts.commandArtifactDef))
			{
				orig.Invoke(self);
				return;
			}
			if (!NetworkServer.active)
			{
				Debug.LogWarning((object)"[Server] function 'System.Void RoR2.ShopTerminalBehavior::DropPickup()' called on client");
				return;
			}
			TrackBehaviour trackBehaviour = new TrackBehaviour();
			if (!onForHidden.Value || !self.hidden)
			{
				trackBehaviour.PickupSource = PickupSource.Terminal;
			}
			self.SetHasBeenPurchased(true);
			CreatePickupDroplet(self.pickupIndex, (Object.op_Implicit((Object)(object)self.dropTransform) ? self.dropTransform : ((Component)self).transform).position, ((Component)self).transform.TransformVector(self.dropVelocity), trackBehaviour);
		}

		private void CreatePickupDroplet(PickupIndex pickupIndex, Vector3 position, Vector3 velocity, TrackBehaviour track)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: 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_0025: 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)
			CreatePickupInfo pickupInfo = new CreatePickupInfo
			{
				rotation = Quaternion.identity,
				position = position
			};
			((CreatePickupInfo)(ref pickupInfo)).pickupIndex = pickupIndex;
			CreatePickupDroplet(pickupInfo, velocity, track);
		}

		public void CreatePickupDroplet(CreatePickupInfo pickupInfo, Vector3 velocity, TrackBehaviour track)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: 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_006e: 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_0077: Unknown result type (might be due to invalid IL or missing references)
			if (CommandArtifactManager.IsCommandArtifactEnabled)
			{
				ref PickupArtifactFlag artifactFlag = ref pickupInfo.artifactFlag;
				artifactFlag = (PickupArtifactFlag)((uint)artifactFlag & 0xFFFFFFFEu);
			}
			GameObject obj = Object.Instantiate<GameObject>(PickupDropletController.pickupDropletPrefab, pickupInfo.position, Quaternion.identity);
			PickupDropletController component = obj.GetComponent<PickupDropletController>();
			TrackBehaviour trackBehaviour = obj.AddComponent<TrackBehaviour>();
			trackBehaviour.PickupSource = track.PickupSource;
			trackBehaviour.DropTable = track.DropTable;
			trackBehaviour.ItemTag = track.ItemTag;
			trackBehaviour.Options = track.Options;
			if (Object.op_Implicit((Object)(object)component))
			{
				component.createPickupInfo = pickupInfo;
				component.NetworkpickupIndex = ((CreatePickupInfo)(ref pickupInfo)).pickupIndex;
			}
			Rigidbody component2 = obj.GetComponent<Rigidbody>();
			component2.velocity = velocity;
			component2.AddTorque(Random.Range(150f, 120f) * Random.onUnitSphere);
			NetworkServer.Spawn(obj);
		}

		public void DropletCollisionEnter(orig_OnCollisionEnter orig, PickupDropletController self, Collision collision)
		{
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: 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_0124: 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_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Invalid comparison between Unknown and I4
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a6: Invalid comparison between Unknown and I4
			//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02be: Invalid comparison between Unknown and I4
			//IL_02d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d6: Invalid comparison between Unknown and I4
			if (!RunArtifactManager.instance.IsArtifactEnabled(Artifacts.commandArtifactDef))
			{
				orig.Invoke(self, collision);
			}
			else if (NetworkServer.active && self.alive)
			{
				List<EquipmentDef> source = new List<EquipmentDef>
				{
					Equipment.AffixBlue,
					Equipment.AffixHaunted,
					Equipment.AffixLunar,
					Equipment.AffixPoison,
					Equipment.AffixRed,
					Equipment.AffixWhite,
					Equipment.EliteVoidEquipment,
					Elites.Earth.eliteEquipmentDef
				};
				((BaseUnityPlugin)this).Logger.LogInfo((object)$"Droplet {self.pickupIndex}:{((PickupIndex)(ref self.pickupIndex)).pickupDef.itemIndex}:{((PickupIndex)(ref self.pickupIndex)).pickupDef.equipmentIndex}");
				self.alive = false;
				self.createPickupInfo.position = ((Component)self).transform.position;
				bool shouldSpawn = true;
				TrackBehaviour trackBehaviour = default(TrackBehaviour);
				bool flag = ((Component)self).gameObject.TryGetComponent<TrackBehaviour>(ref trackBehaviour);
				PickupDef pickupDef = PickupCatalog.GetPickupDef(self.pickupIndex);
				bool flag2 = false;
				if ((int)pickupDef.itemIndex != -1)
				{
					flag2 = ItemCatalog.GetItemDef(pickupDef.itemIndex).ContainsTag((ItemTag)9);
				}
				if (!(Random.Range(0f, 100f) < (float)essenceChance.Value) || flag2 || (!onForDelusion.Value && ((Enum)self.createPickupInfo.artifactFlag).HasFlag((Enum)(object)(PickupArtifactFlag)2)) || (!onInBazaar.Value && (Object)(object)BazaarController.instance != (Object)null) || (!scrappersDropEssence.Value && flag && trackBehaviour.PickupSource == PickupSource.Scrapper) || (!onForAdaptive.Value && flag && trackBehaviour.PickupSource == PickupSource.Roulette) || (!onInDropShip.Value && flag && trackBehaviour.PickupSource == PickupSource.Terminal) || (!onForTrophy.Value && flag && trackBehaviour.PickupSource == PickupSource.BossHunter) || (!onForPotential.Value && flag && trackBehaviour.PickupSource == PickupSource.VoidPotential) || ((PickupIndex)(ref self.pickupIndex)).pickupDef == null || ((int)((PickupIndex)(ref self.pickupIndex)).pickupDef.itemIndex == -1 && (int)((PickupIndex)(ref self.pickupIndex)).pickupDef.equipmentIndex == -1 && (int)((PickupIndex)(ref self.pickupIndex)).pickupDef.itemTier == 5) || (!onForAspect.Value && source.Any((EquipmentDef x) => x.equipmentIndex == ((PickupIndex)(ref self.pickupIndex)).pickupDef.equipmentIndex)))
				{
					GenericPickupController.CreatePickup(ref self.createPickupInfo);
				}
				else if (flag && trackBehaviour.Options.Count() == 1)
				{
					self.createPickupInfo.pickerOptions = trackBehaviour.Options;
					GenericPickupController.CreatePickup(ref self.createPickupInfo);
				}
				else
				{
					CreateCommandCube(ref self.createPickupInfo, ref shouldSpawn, trackBehaviour);
				}
				Object.Destroy((Object)(object)((Component)self).gameObject);
			}
		}

		private void CreateCommandCube(ref CreatePickupInfo createPickupInfo, ref bool shouldSpawn, TrackBehaviour trackBehaviour = null)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: 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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Invalid comparison between Unknown and I4
			//IL_0064: 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_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Invalid comparison between Unknown and I4
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: 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_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Invalid comparison between Unknown and I4
			PickupIndex pickupIndex = ((CreatePickupInfo)(ref createPickupInfo)).pickupIndex;
			PickupDef pickupDef = PickupCatalog.GetPickupDef(pickupIndex);
			((BaseUnityPlugin)this).Logger.LogInfo((object)$"PickupDef {pickupDef.internalName}:{pickupDef.itemTier}:{pickupDef.itemIndex}");
			if (pickupDef != null && ((int)pickupDef.itemIndex != -1 || (int)pickupDef.equipmentIndex != -1 || (int)pickupDef.itemTier != 5))
			{
				GameObject val = Object.Instantiate<GameObject>(CommandArtifactManager.commandCubePrefab, createPickupInfo.position, createPickupInfo.rotation);
				if ((Object)(object)trackBehaviour != (Object)null)
				{
					TrackBehaviour trackBehaviour2 = val.AddComponent<TrackBehaviour>();
					trackBehaviour2.ItemTag = trackBehaviour.ItemTag;
					trackBehaviour2.DropTable = trackBehaviour.DropTable;
					trackBehaviour2.PickupSource = trackBehaviour.PickupSource;
					trackBehaviour2.Options = trackBehaviour.Options;
				}
				val.GetComponent<PickupIndexNetworker>().NetworkpickupIndex = pickupIndex;
				PickupPickerController component = val.GetComponent<PickupPickerController>();
				component.SetOptionsFromPickupForCommandArtifact(pickupIndex);
				component.chestGeneratedFrom = createPickupInfo.chest;
				NetworkServer.Spawn(val);
				shouldSpawn = false;
			}
		}

		[Server]
		private void SetOptions(orig_SetOptionsFromPickupForCommandArtifact orig, PickupPickerController self, PickupIndex pickupIndex)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Invalid comparison between Unknown and I4
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Expected I4, but got Unknown
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Invalid comparison between Unknown and I4
			//IL_0206: Unknown result type (might be due to invalid IL or missing references)
			//IL_020c: Invalid comparison between Unknown and I4
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Invalid comparison between Unknown and I4
			//IL_0300: Unknown result type (might be due to invalid IL or missing references)
			//IL_0311: Unknown result type (might be due to invalid IL or missing references)
			//IL_0316: Unknown result type (might be due to invalid IL or missing references)
			//IL_031b: Unknown result type (might be due to invalid IL or missing references)
			//IL_031d: Unknown result type (might be due to invalid IL or missing references)
			//IL_037d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0382: Unknown result type (might be due to invalid IL or missing references)
			//IL_038a: Unknown result type (might be due to invalid IL or missing references)
			//IL_039a: Unknown result type (might be due to invalid IL or missing references)
			//IL_039c: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a1: 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)
			TrackBehaviour component = ((Component)self).gameObject.GetComponent<TrackBehaviour>();
			if (!NetworkServer.active)
			{
				return;
			}
			int count = GetItemAmountFromTier(((PickupIndex)(ref pickupIndex)).pickupDef);
			PickupIndex[] array = null;
			if ((Object)(object)component != (Object)null && keepCategory.Value && ((int)component.ItemTag == 1 || (int)component.ItemTag == 2 || (int)component.ItemTag == 3))
			{
				PickupDropTable dropTable = component.DropTable;
				array = (from x in ((BasicPickupDropTable)((dropTable is BasicPickupDropTable) ? dropTable : null)).selector.choices
					where ((PickupIndex)(ref x.value)).pickupDef.itemTier == ((PickupIndex)(ref pickupIndex)).pickupDef.itemTier
					select x.value).ToArray();
			}
			else
			{
				if ((Object)(object)component != (Object)null && sameBossDrops.Value && component.PickupSource == PickupSource.Boss)
				{
					self.SetOptionsServer(component.Options);
					return;
				}
				if ((Object)(object)component != (Object)null && component.PickupSource == PickupSource.YellowBoss)
				{
					self.SetOptionsServer(component.Options);
					return;
				}
				ItemTier itemTier = ((PickupIndex)(ref pickupIndex)).pickupDef.itemTier;
				switch ((int)itemTier)
				{
				case 0:
					array = Run.instance.availableTier1DropList.ToArray();
					break;
				case 1:
					array = Run.instance.availableTier2DropList.ToArray();
					break;
				case 2:
					array = Run.instance.availableTier3DropList.ToArray();
					break;
				case 4:
					array = Run.instance.availableBossDropList.ToArray();
					break;
				case 3:
					array = Run.instance.availableLunarItemDropList.ToArray();
					break;
				case 6:
					array = Run.instance.availableVoidTier1DropList.ToArray();
					break;
				case 7:
					array = Run.instance.availableVoidTier2DropList.ToArray();
					break;
				case 8:
					array = Run.instance.availableVoidTier3DropList.ToArray();
					break;
				case 9:
					array = Run.instance.availableVoidBossDropList.ToArray();
					break;
				case 5:
					if ((int)((PickupIndex)(ref pickupIndex)).pickupDef.equipmentIndex != -1)
					{
						array = ((!((PickupIndex)(ref pickupIndex)).pickupDef.isLunar) ? Run.instance.availableEquipmentDropList.ToArray() : Run.instance.availableLunarEquipmentDropList.ToArray());
					}
					break;
				}
			}
			List<EquipmentDef> source = new List<EquipmentDef>
			{
				Equipment.AffixBlue,
				Equipment.AffixHaunted,
				Equipment.AffixLunar,
				Equipment.AffixPoison,
				Equipment.AffixRed,
				Equipment.AffixWhite,
				Elites.Earth.eliteEquipmentDef
			};
			if (onForAspect.Value && source.Any((EquipmentDef x) => x.equipmentIndex == ((PickupIndex)(ref pickupIndex)).pickupDef.equipmentIndex))
			{
				array = source.Select((EquipmentDef x) => PickupCatalog.FindPickupIndex(x.equipmentIndex)).ToArray();
				count = itemAmountAspect.Value;
			}
			Option[] array2;
			if (array == null)
			{
				array2 = (Option[])(object)new Option[1]
				{
					new Option
					{
						available = true,
						pickupIndex = pickupIndex
					}
				};
			}
			else
			{
				Xoroshiro128Plus rng = Run.instance.treasureRng;
				List<PickupIndex> list = (from x in array.ToList()
					orderby rng.Next()
					select x).Take(count).ToList();
				array2 = (Option[])(object)new Option[list.Count];
				for (int i = 0; i < list.Count; i++)
				{
					PickupIndex pickupIndex2 = list[i];
					array2[i] = new Option
					{
						available = true,
						pickupIndex = pickupIndex2
					};
				}
			}
			self.SetOptionsServer(array2);
		}

		public int GetItemAmountFromTier(PickupDef pickup)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected I4, but got Unknown
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Invalid comparison between Unknown and I4
			int result = 0;
			ItemTier itemTier = pickup.itemTier;
			switch ((int)itemTier)
			{
			case 0:
				result = itemAmountCommon.Value;
				break;
			case 1:
				result = itemAmountUncommon.Value;
				break;
			case 2:
				result = itemAmountLegendary.Value;
				break;
			case 4:
				result = itemAmountBoss.Value;
				break;
			case 3:
				result = itemAmountLunar.Value;
				break;
			case 5:
				if ((int)pickup.equipmentIndex != -1)
				{
					result = itemAmountEquip.Value;
				}
				break;
			case 6:
			case 7:
			case 8:
			case 9:
				result = itemAmountVoid.Value;
				break;
			default:
				result = itemAmountCommon.Value;
				break;
			}
			return result;
		}
	}
	public class TrackBehaviour : MonoBehaviour
	{
		public ItemTag ItemTag { get; set; }

		public PickupDropTable DropTable { get; set; }

		public PickupSource PickupSource { get; set; }

		public Option[] Options { get; set; }

		public TrackBehaviour()
		{
			Options = (Option[])(object)new Option[0];
		}
	}
	public enum PickupSource
	{
		Chest,
		Terminal,
		Boss,
		YellowBoss,
		BossHunter,
		Roulette,
		Scrapper,
		VoidPotential,
		Cell
	}
}