Decompiled source of AutoCommandQueuePickup fixed v1.1.1

AutoCommandQueuePickup.dll

Decompiled 5 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using System.Text.RegularExpressions;
using AutoCommandQueuePickup.Configuration;
using AutoCommandQueuePickup.Hooks;
using AutoCommandQueuePickup.ItemDistributors;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates.Scrapper;
using IL.EntityStates.Scrapper;
using IL.RoR2;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using MonoMod.RuntimeDetour.HookGen;
using On.RoR2;
using On.RoR2.Artifacts;
using On.RoR2.UI;
using ProperSave;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Artifacts;
using RoR2.UI;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.UI;

[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: AssemblyVersion("1.1.1.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class IsReadOnlyAttribute : Attribute
	{
	}
	[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;
		}
	}
}
public class CharacterMasterManager : MonoBehaviour
{
	public static Dictionary<uint, CharacterMaster> playerCharacterMasters = new Dictionary<uint, CharacterMaster>();
}
namespace AutoCommandQueuePickup
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInIncompatibility("com.kuberoot.commandqueue")]
	[BepInIncompatibility("com.kuberoot.autoitempickup")]
	[BepInPlugin("Hero-X.AutoCommandQueuePickup", "AutoCommandQueuePickup", "1.1.1")]
	public class AutoCommandQueuePickup : BaseUnityPlugin
	{
		public const string PluginAuthor = "Hero-X";

		public const string PluginName = "AutoCommandQueuePickup";

		public const string PluginGUID = "Hero-X.AutoCommandQueuePickup";

		public const string PluginVersion = "1.1.1";

		private static readonly MethodInfo GenericPickupController_AttemptGrant = typeof(GenericPickupController).GetMethod("AttemptGrant", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

		private static readonly FieldInfo GenericPickupController_consumed = typeof(GenericPickupController).GetField("consumed", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

		private bool distributorNeedsUpdate;

		public static Action PluginUnloaded;

		public static bool IsLoaded;

		public static bool dontDestroy = false;

		private HookManager hookManager;

		public readonly string LastCommandQueuePath = Path.Combine(Application.persistentDataPath, "ProperSave", "Saves") + "\\LastCommandQueue.csv";

		private static GameObject commandUIPrefab;

		public static readonly FieldInfo commandCubePrefabField = typeof(CommandArtifactManager).GetField("commandCubePrefab", BindingFlags.Static | BindingFlags.Public);

		private static readonly FieldInfo PickupPickerController_options = typeof(PickupPickerController).GetField("options", BindingFlags.Instance | BindingFlags.NonPublic);

		public ItemDistributor Distributor { get; private set; }

		public static Config config { get; private set; }

		private void Awake()
		{
			Log.Init(((BaseUnityPlugin)this).Logger);
			config = new Config(this, ((BaseUnityPlugin)this).Logger);
		}

		private void SaveFile_OnGatherSaveData(Dictionary<string, object> obj)
		{
			SaveAndLoad.Save(LastCommandQueuePath);
		}

		private void Loading_OnLoadingEnded(SaveFile _)
		{
			if (File.Exists(LastCommandQueuePath))
			{
				SaveAndLoad.Load(LastCommandQueuePath);
			}
			else
			{
				Log.Warning("CommandQueue save file does not exist!");
			}
		}

		public void OnEnable()
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Expected O, but got Unknown
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Expected O, but got Unknown
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Expected O, but got Unknown
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Expected O, but got Unknown
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Expected O, but got Unknown
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Expected O, but got Unknown
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Expected O, but got Unknown
			hookManager = new HookManager(this);
			hookManager.RegisterHooks();
			object? value = commandCubePrefabField.GetValue(null);
			object? obj = ((value is GameObject) ? value : null);
			commandUIPrefab = ((obj != null) ? ((GameObject)obj).GetComponent<PickupPickerController>().panelPrefab : null);
			PlayerCharacterMasterController.OnBodyDeath += (hook_OnBodyDeath)delegate(orig_OnBodyDeath orig, PlayerCharacterMasterController self)
			{
				orig.Invoke(self);
				UpdateTargets();
			};
			PlayerCharacterMasterController.OnBodyStart += (hook_OnBodyStart)delegate(orig_OnBodyStart orig, PlayerCharacterMasterController self)
			{
				orig.Invoke(self);
				UpdateTargets();
			};
			PickupDropletController.CreatePickup += new Manipulator(ModifyCreatePickup);
			PlayerCharacterMasterController.Awake += new hook_Awake(OnPlayerAwake);
			PlayerCharacterMasterController.onPlayerAdded += UpdateTargetsWrapper;
			PlayerCharacterMasterController.onPlayerRemoved += UpdateTargetsWrapper;
			config.distributionMode.SettingChanged += delegate
			{
				Distributor = ItemDistributor.GetItemDistributor(config.distributionMode.Value, this);
			};
			IsLoaded = true;
			ScoreboardController.Awake += new hook_Awake(ScoreboardController_Awake);
			PickupPickerController.OnDisplayBegin += new hook_OnDisplayBegin(HandleCommandDisplayBegin);
			CommandArtifactManager.Init += new hook_Init(CommandArtifactManager_Init);
			QueueManager.Enable();
			HUD[] array = Object.FindObjectsOfType<HUD>();
			foreach (HUD val in array)
			{
				val.scoreboardPanel.AddComponent<UIManager>();
			}
			SaveFile.OnGatherSaveData += SaveFile_OnGatherSaveData;
			Loading.OnLoadingEnded += Loading_OnLoadingEnded;
		}

		public void OnDisable()
		{
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Expected O, but got Unknown
			CharacterMasterManager.playerCharacterMasters.Clear();
			hookManager.UnregisterHooks();
			HookEndpointManager.RemoveAllOwnedBy(HookEndpointManager.GetOwner((Delegate)new Action(OnDisable)));
			PlayerCharacterMasterController.onPlayerAdded -= UpdateTargetsWrapper;
			PlayerCharacterMasterController.onPlayerRemoved -= UpdateTargetsWrapper;
			IsLoaded = false;
			PluginUnloaded?.Invoke();
			ScoreboardController.Awake -= new hook_Awake(ScoreboardController_Awake);
			QueueManager.Disable();
		}

		private void CommandArtifactManager_Init(orig_Init orig)
		{
			orig.Invoke();
			object? value = commandCubePrefabField.GetValue(null);
			object? obj = ((value is GameObject) ? value : null);
			commandUIPrefab = ((obj != null) ? ((GameObject)obj).GetComponent<PickupPickerController>().panelPrefab : null);
		}

		private void HandleCommandDisplayBegin(orig_OnDisplayBegin orig, PickupPickerController self, NetworkUIPromptController networkUIPromptController, LocalUser localUser, CameraRigController cameraRigController)
		{
			//IL_0043: 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_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_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: 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)
			if ((Object)(object)self.panelPrefab == (Object)(object)commandUIPrefab)
			{
				foreach (var (tier, val) in QueueManager.PeekAll())
				{
					if (!self.IsChoiceAvailable(val))
					{
						continue;
					}
					QueueManager.Pop(tier);
					Option[] array = (Option[])PickupPickerController_options.GetValue(self);
					int i;
					for (i = 0; i < array.Length; i++)
					{
						if (array[i].pickupIndex == val && array[i].available)
						{
							((MonoBehaviour)self).StartCoroutine(submitChoiceNextFrame());
							break;
						}
					}
					return;
					IEnumerator submitChoiceNextFrame()
					{
						yield return 0;
						self.SubmitChoice(i);
					}
				}
			}
			orig.Invoke(self, networkUIPromptController, localUser, cameraRigController);
		}

		private void ScoreboardController_Awake(orig_Awake orig, ScoreboardController self)
		{
			UIManager uIManager = ((Component)self).gameObject.AddComponent<UIManager>();
			orig.Invoke(self);
		}

		private void UpdateTargetsWrapper(PlayerCharacterMasterController player)
		{
			//IL_000c: 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_002f: 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)
			Dictionary<uint, CharacterMaster> playerCharacterMasters = CharacterMasterManager.playerCharacterMasters;
			NetworkInstanceId netId = ((NetworkBehaviour)player.master).netId;
			if (!playerCharacterMasters.ContainsKey(((NetworkInstanceId)(ref netId)).Value))
			{
				Dictionary<uint, CharacterMaster> playerCharacterMasters2 = CharacterMasterManager.playerCharacterMasters;
				netId = ((NetworkBehaviour)player.master).netId;
				playerCharacterMasters2.Add(((NetworkInstanceId)(ref netId)).Value, player.master);
				UpdateTargets();
			}
		}

		private void OnPlayerAwake(orig_Awake orig, PlayerCharacterMasterController self)
		{
			orig.Invoke(self);
			if (!NetworkServer.active)
			{
				return;
			}
			CharacterMaster master = self.master;
			if (Object.op_Implicit((Object)(object)master))
			{
				master.onBodyStart += delegate
				{
					UpdateTargets();
				};
			}
		}

		private void ModifyCreatePickup(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.GotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction i) => ILPatternMatchingExt.MatchCall<GenericPickupController>(i, "CreatePickup")
			});
			val.Emit(OpCodes.Dup);
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Action<GenericPickupController, PickupDropletController>>((Action<GenericPickupController, PickupDropletController>)delegate(GenericPickupController pickupController, PickupDropletController self)
			{
				OverrideDistributorBehaviour component = ((Component)self).GetComponent<OverrideDistributorBehaviour>();
				if (Object.op_Implicit((Object)(object)component))
				{
					OverrideDistributorBehaviour overrideDistributorBehaviour = ((Component)pickupController).gameObject.AddComponent<OverrideDistributorBehaviour>();
					overrideDistributorBehaviour.Distributor = component.Distributor;
				}
			});
		}

		[Server]
		public static void GrantItem(GenericPickupController item, CharacterMaster master)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Invalid comparison between Unknown and I4
			//IL_005b: 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_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: 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_00d4: 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_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			if (master.hasBody)
			{
				GenericPickupController_AttemptGrant.Invoke(item, new object[1] { master.GetBody() });
				return;
			}
			PickupDef pickupDef = PickupCatalog.GetPickupDef(item.pickupIndex);
			ItemIndex val = (ItemIndex)((pickupDef == null) ? (-1) : ((int)pickupDef.itemIndex));
			if ((int)val != -1)
			{
				master.inventory.GiveItem(val, 1);
				PlayerCharacterMasterController playerCharacterMasterController = master.playerCharacterMasterController;
				NetworkUser subjectAsNetworkUser = (((Object)(object)playerCharacterMasterController != (Object)null) ? playerCharacterMasterController.networkUser : null);
				PickupDef pickupDef2 = PickupCatalog.GetPickupDef(item.pickupIndex);
				Chat.AddMessage(((ChatMessageBase)new PlayerPickupChatMessage
				{
					subjectAsNetworkUser = subjectAsNetworkUser,
					baseToken = "PLAYER_PICKUP",
					pickupToken = (pickupDef2?.nameToken ?? PickupCatalog.invalidPickupToken),
					pickupColor = Color32.op_Implicit(pickupDef2?.baseColor ?? Color.black),
					pickupQuantity = (uint)master.inventory.GetItemCount(val)
				}).ConstructChatString());
				GenericPickupController_consumed.SetValue(item, true);
				Object.Destroy((Object)(object)((Component)item).gameObject);
			}
		}

		public static bool GrantCommandItem(PickupIndex pickupIndex, CharacterMaster master)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: 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_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Invalid comparison between Unknown and I4
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: 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_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			PickupDef pickupDef = PickupCatalog.GetPickupDef(pickupIndex);
			ItemIndex val = (ItemIndex)((pickupDef == null) ? (-1) : ((int)pickupDef.itemIndex));
			if ((int)val != -1)
			{
				master.inventory.GiveItem(val, 1);
				PlayerCharacterMasterController playerCharacterMasterController = master.playerCharacterMasterController;
				NetworkUser subjectAsNetworkUser = ((playerCharacterMasterController != null) ? playerCharacterMasterController.networkUser : null);
				PickupDef pickupDef2 = PickupCatalog.GetPickupDef(pickupIndex);
				Chat.AddMessage(((ChatMessageBase)new PlayerPickupChatMessage
				{
					subjectAsNetworkUser = subjectAsNetworkUser,
					baseToken = "PLAYER_PICKUP",
					pickupToken = (pickupDef2?.nameToken ?? PickupCatalog.invalidPickupToken),
					pickupColor = Color32.op_Implicit(pickupDef2?.baseColor ?? Color.black),
					pickupQuantity = (uint)master.inventory.GetItemCount(val)
				}).ConstructChatString());
				return true;
			}
			return false;
		}

		private void UpdateTargets()
		{
			distributorNeedsUpdate = true;
		}

		public void PreDistributeItemInternal(Cause cause)
		{
			if (Distributor == null)
			{
				Distributor = ItemDistributor.GetItemDistributor(config.distributionMode.Value, this);
			}
			if (distributorNeedsUpdate)
			{
				distributorNeedsUpdate = false;
				Distributor?.UpdateTargets();
			}
		}

		public void DistributeItemInternal(GenericPickupController item, Cause cause)
		{
			ItemDistributor distributorInternal = GetDistributorInternal(((Component)item).gameObject);
			try
			{
				distributorInternal.DistributeItem(item);
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)$"Caught AutoItemPickup distributor exception:\n{ex}\n{ex.StackTrace}");
			}
		}

		public void DistributeItem(GenericPickupController item, Cause cause)
		{
			PreDistributeItemInternal(cause);
			DistributeItemInternal(item, cause);
		}

		public void DistributeItems(IEnumerable<GenericPickupController> items, Cause cause)
		{
			PreDistributeItemInternal(cause);
			foreach (GenericPickupController item in items)
			{
				DistributeItemInternal(item, cause);
			}
		}

		public ItemDistributor GetDistributorInternal(GameObject item)
		{
			if ((Object)(object)item != (Object)null)
			{
				OverrideDistributorBehaviour component = item.GetComponent<OverrideDistributorBehaviour>();
				if ((Object)(object)component != (Object)null)
				{
					return component.Distributor;
				}
			}
			return Distributor;
		}

		public ItemDistributor GetDistributor(GameObject item, Cause cause)
		{
			PreDistributeItemInternal(cause);
			return GetDistributorInternal(item);
		}
	}
	public class CommandArtifactPickup : MonoBehaviour
	{
		public PickupIndex pickupIndex;

		public PickupDropletController pickupDropletController;

		public CharacterMaster characterMaster;

		public bool isCommand;
	}
	public enum Cause
	{
		Teleport,
		Drop
	}
	public enum Mode
	{
		Sequential,
		Random,
		Closest,
		LeastItems
	}
	public enum Distribution
	{
		OnTeleport,
		OnDrop
	}
	internal class QueueDisplay : MonoBehaviour
	{
		public class QueueItemBehavior : MonoBehaviour, IBeginDragHandler, IEventSystemHandler, IDragHandler, IEndDragHandler, IPointerClickHandler
		{
			private GameObject m_DraggingIcon;

			private QueueDisplay m_Queue;

			private ItemIcon m_ItemIcon;

			public void Init(QueueDisplay queue)
			{
				m_Queue = queue;
				m_ItemIcon = ((Component)this).GetComponent<ItemIcon>();
			}

			public void OnBeginDrag(PointerEventData eventData)
			{
				//IL_0002: 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_0009: 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_000c: Unknown result type (might be due to invalid IL or missing references)
				//IL_000e: Invalid comparison between Unknown and I4
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0029: Expected O, but got Unknown
				//IL_0091: Unknown result type (might be due to invalid IL or missing references)
				//IL_0096: 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_00c1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_0106: Unknown result type (might be due to invalid IL or missing references)
				InputButton button = eventData.button;
				InputButton val = button;
				if ((int)val <= 1)
				{
					m_DraggingIcon = new GameObject("QueueItemDragIcon");
					m_DraggingIcon.transform.SetParent(((Component)m_Queue).transform, false);
					m_DraggingIcon.transform.SetAsLastSibling();
					RawImage val2 = m_DraggingIcon.AddComponent<RawImage>();
					val2.texture = m_ItemIcon.image.texture;
					RectTransform rectTransform = ((Graphic)val2).rectTransform;
					Rect rect = ((Graphic)m_ItemIcon.image).rectTransform.rect;
					float height = ((Rect)(ref rect)).height;
					rectTransform.anchorMin = new Vector2(0.5f, 0.5f);
					rectTransform.anchorMax = new Vector2(0.5f, 0.5f);
					rectTransform.sizeDelta = new Vector2(height, height);
					((Transform)rectTransform).localScale = ((Transform)m_ItemIcon.rectTransform).localScale;
					((Graphic)val2).color = new Color(1f, 1f, 1f, 0.6f);
					SetDraggedPosition(eventData);
					((AbstractEventData)eventData).Use();
				}
			}

			public void OnDrag(PointerEventData eventData)
			{
				if (Object.op_Implicit((Object)(object)m_DraggingIcon))
				{
					SetDraggedPosition(eventData);
					((AbstractEventData)eventData).Use();
				}
			}

			public void OnEndDrag(PointerEventData eventData)
			{
				//IL_0030: 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_00db: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e1: Invalid comparison between Unknown and I4
				//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
				if (!Object.op_Implicit((Object)(object)m_DraggingIcon))
				{
					return;
				}
				Object.Destroy((Object)(object)m_DraggingIcon);
				Vector2 val = default(Vector2);
				if (RectTransformUtility.ScreenPointToLocalPointInRectangle(m_Queue.rectTransform, eventData.position, eventData.pressEventCamera, ref val))
				{
					float num = val.x / (m_Queue.iconScale * (m_Queue.itemIconPrefabWidth + 5f));
					int newIndex = Mathf.RoundToInt(num);
					int num2 = m_Queue.icons.FindIndex((ItemIcon icon) => (Object)(object)((Component)icon).gameObject == (Object)(object)((Component)this).gameObject);
					List<QueueManager.QueueEntry> queue = m_Queue.queue;
					if (num2 < 0 || num2 > queue.Count)
					{
						return;
					}
					int num3 = m_Queue.queue[num2].count;
					if ((int)eventData.button == 1 && num3 > 1)
					{
						num3 /= 2;
					}
					QueueManager.Move(m_Queue.tier, num2, newIndex, num3);
				}
				((AbstractEventData)eventData).Use();
			}

			private void SetDraggedPosition(PointerEventData data)
			{
				//IL_0019: 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)
				RectTransform component = m_DraggingIcon.GetComponent<RectTransform>();
				Vector3 position = default(Vector3);
				if (RectTransformUtility.ScreenPointToWorldPointInRectangle(m_Queue.rectTransform, data.position, data.pressEventCamera, ref position))
				{
					((Transform)component).position = position;
				}
			}

			public void OnPointerClick(PointerEventData eventData)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Invalid comparison between Unknown and I4
				//IL_0067: Unknown result type (might be due to invalid IL or missing references)
				//IL_0074: Unknown result type (might be due to invalid IL or missing references)
				if ((int)eventData.button != 1 || !AutoCommandQueuePickup.config.rightClickRemovesStack.Value)
				{
					return;
				}
				List<ItemIcon> icons = m_Queue.icons;
				for (int i = 0; i < icons.Count; i++)
				{
					if ((Object)(object)((Component)icons[i]).gameObject == (Object)(object)((Component)this).gameObject)
					{
						QueueManager.QueueEntry queueEntry = m_Queue.queue[i];
						QueueManager.Remove(m_Queue.tier, i, queueEntry.count);
						break;
					}
				}
				((AbstractEventData)eventData).Use();
			}
		}

		public GameObject itemIconPrefab;

		public float itemIconPrefabWidth = 64f;

		public ItemTier tier;

		private float iconScale = 1f;

		private RectTransform rectTransform;

		private readonly List<ItemIcon> icons = new List<ItemIcon>();

		private List<QueueManager.QueueEntry> queue;

		public void Awake()
		{
			ref RectTransform reference = ref rectTransform;
			Transform transform = ((Component)this).transform;
			reference = (RectTransform)(object)((transform is RectTransform) ? transform : null);
		}

		public void Start()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			Rect rect = rectTransform.rect;
			iconScale = (((Rect)(ref rect)).height - 10f) / itemIconPrefabWidth;
			LayoutIcons();
		}

		public void LayoutIcon(int index, RectTransform transform)
		{
			//IL_001d: 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)
			transform.anchoredPosition = new Vector2((float)index * iconScale * (itemIconPrefabWidth + 5f), 5f);
			((Transform)transform).localScale = new Vector3(iconScale, iconScale, 1f);
		}

		public void LayoutIcons(int first = 0)
		{
			for (int i = first; i < icons.Count; i++)
			{
				LayoutIcon(i, icons[i].rectTransform);
			}
		}

		public ItemIcon AllocateIcon(int index)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Expected O, but got Unknown
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: 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_009b: Unknown result type (might be due to invalid IL or missing references)
			ItemIcon icon = Object.Instantiate<GameObject>(itemIconPrefab, (Transform)(object)rectTransform, false).GetComponent<ItemIcon>();
			RectTransform val = icon.rectTransform;
			Button val2 = ((Component)icon).gameObject.AddComponent<Button>();
			((UnityEvent)val2.onClick).AddListener((UnityAction)delegate
			{
				//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)
				for (int i = 0; i < icons.Count; i++)
				{
					if ((Object)(object)icons[i] == (Object)(object)icon)
					{
						QueueManager.Remove(tier, i);
						break;
					}
				}
			});
			Navigation navigation = default(Navigation);
			((Navigation)(ref navigation)).mode = (Mode)0;
			((Selectable)val2).navigation = navigation;
			val.anchorMin = new Vector2(0f, 1f);
			val.anchorMax = new Vector2(0f, 1f);
			LayoutIcon(index, val);
			QueueItemBehavior queueItemBehavior = ((Component)icon).gameObject.AddComponent<QueueItemBehavior>();
			queueItemBehavior.Init(this);
			icons.Insert(index, icon);
			return icon;
		}

		public void AllocateIcons(int count, Action<int, ItemIcon> action = null)
		{
			for (int num = icons.Count - 1; num >= count; num--)
			{
				Object.Destroy((Object)(object)((Component)icons[num]).gameObject);
				icons.RemoveAt(num);
			}
			for (int i = icons.Count; i < count; i++)
			{
				ItemIcon arg = AllocateIcon(i);
				action?.Invoke(i, arg);
			}
		}

		public void DestroyUI()
		{
			foreach (ItemIcon icon in icons)
			{
				Object.Destroy((Object)(object)((Component)icon).gameObject);
			}
			icons.Clear();
		}

		public void UpdateUI()
		{
			AllocateIcons(queue.Count);
			UpdateIcons();
		}

		private void UpdateIcon(int i)
		{
			//IL_001d: 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)
			ItemIcon val = icons[i];
			QueueManager.QueueEntry queueEntry = queue[i];
			val.SetItemIndex(PickupCatalog.GetPickupDef(queueEntry.pickupIndex).itemIndex, queueEntry.count);
		}

		private void UpdateIcons()
		{
			for (int i = 0; i < icons.Count; i++)
			{
				UpdateIcon(i);
			}
		}

		private void HandleQueueChange(QueueManager.QueueChange change, ItemTier tier, int index)
		{
			//IL_0015: 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)
			if (Object.op_Implicit((Object)(object)itemIconPrefab) && tier == this.tier)
			{
				switch (change)
				{
				case QueueManager.QueueChange.Changed:
					UpdateIcon(index);
					break;
				case QueueManager.QueueChange.Added:
					AllocateIcon(index);
					UpdateIcon(index);
					break;
				case QueueManager.QueueChange.Removed:
					Object.Destroy((Object)(object)((Component)icons[index]).gameObject);
					icons.RemoveAt(index);
					LayoutIcons(index);
					break;
				case QueueManager.QueueChange.Moved:
					UpdateUI();
					break;
				}
			}
		}

		public void OnEnable()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)itemIconPrefab))
			{
				queue = QueueManager.mainQueues[tier];
				UpdateUI();
				QueueManager.OnQueueChanged += HandleQueueChange;
			}
		}

		public void OnDisable()
		{
			QueueManager.OnQueueChanged -= HandleQueueChange;
		}
	}
	public static class QueueManager
	{
		public struct QueueEntry
		{
			public PickupIndex pickupIndex;

			public int count;
		}

		public enum QueueChange
		{
			Removed,
			Added,
			Changed,
			Moved
		}

		public static Dictionary<ItemTier, List<QueueEntry>> mainQueues = new Dictionary<ItemTier, List<QueueEntry>>
		{
			{
				(ItemTier)0,
				new List<QueueEntry>()
			},
			{
				(ItemTier)1,
				new List<QueueEntry>()
			},
			{
				(ItemTier)2,
				new List<QueueEntry>()
			}
		};

		public static Dictionary<ItemTier, bool> queueRepeat = new Dictionary<ItemTier, bool>();

		public static event Action<Run> OnRunQueueInit;

		public static event Action<QueueChange, ItemTier, int> OnQueueChanged;

		internal static void Enable()
		{
			Run.onRunStartGlobal += InitQueues;
			UpdateQueueAvailability();
		}

		internal static void Disable()
		{
			Run.onRunStartGlobal -= InitQueues;
		}

		public static void UpdateQueueAvailability()
		{
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: 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_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_00cf: Unknown result type (might be due to invalid IL or missing references)
			object[] array = (from a in AutoCommandQueuePickup.config.enabledTabsConfig
				where a.Value
				select Enum.Parse(typeof(ItemTier), ((ConfigEntryBase)a).Definition.Key)).ToArray();
			ItemTier[] array2 = mainQueues.Keys.ToArray();
			foreach (ItemTier val in array2)
			{
				if (!array.Contains(val))
				{
					mainQueues.Remove(val);
				}
			}
			object[] array3 = array;
			for (int j = 0; j < array3.Length; j++)
			{
				ItemTier key = (ItemTier)array3[j];
				if (!mainQueues.ContainsKey(key))
				{
					mainQueues.Add(key, new List<QueueEntry>());
				}
			}
		}

		private static void InitQueues(Run run)
		{
			mainQueues.Clear();
			UpdateQueueAvailability();
			QueueManager.OnRunQueueInit?.Invoke(run);
		}

		public static bool DoesRepeat(ItemTier tier)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			bool value;
			return queueRepeat.TryGetValue(tier, out value) && value;
		}

		public static void ToggleRepeat(ItemTier tier)
		{
			//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)
			queueRepeat[tier] = !DoesRepeat(tier);
		}

		public static void Enqueue(PickupIndex pickupIndex)
		{
			//IL_0001: 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_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_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: 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_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: 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)
			ItemTier tier = ItemCatalog.GetItemDef(PickupCatalog.GetPickupDef(pickupIndex).itemIndex).tier;
			List<QueueEntry> list = mainQueues[tier];
			if (list.Count > 0)
			{
				QueueEntry value = list[list.Count - 1];
				if (value.pickupIndex == pickupIndex)
				{
					value.count++;
					list[list.Count - 1] = value;
					QueueManager.OnQueueChanged?.Invoke(QueueChange.Changed, tier, list.Count - 1);
					return;
				}
			}
			QueueEntry queueEntry = default(QueueEntry);
			queueEntry.pickupIndex = pickupIndex;
			queueEntry.count = 1;
			QueueEntry item = queueEntry;
			list.Add(item);
			QueueManager.OnQueueChanged?.Invoke(QueueChange.Added, tier, list.Count - 1);
		}

		public static PickupIndex Peek(ItemTier tier)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: 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_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_0031: Unknown result type (might be due to invalid IL or missing references)
			List<QueueEntry> list = mainQueues[tier];
			if (list.Count == 0)
			{
				return PickupIndex.none;
			}
			return list[0].pickupIndex;
		}

		public static PickupIndex Pop(ItemTier tier)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: 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_000a: 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_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: 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)
			PickupIndex val = Remove(tier, 0);
			if (DoesRepeat(tier))
			{
				Enqueue(val);
			}
			return val;
		}

		public static PickupIndex Remove(ItemTier tier, int index, int count = 1)
		{
			//IL_0006: 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_0046: 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_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: 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_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			List<QueueEntry> list = mainQueues[tier];
			QueueEntry value = list[index];
			value.count -= count;
			if (value.count <= 0)
			{
				list.RemoveAt(index);
				QueueManager.OnQueueChanged?.Invoke(QueueChange.Removed, tier, index);
				if (TryMerge(tier, index - 1, index))
				{
					QueueManager.OnQueueChanged?.Invoke(QueueChange.Removed, tier, index);
					QueueManager.OnQueueChanged?.Invoke(QueueChange.Changed, tier, index - 1);
				}
			}
			else
			{
				list[index] = value;
				QueueManager.OnQueueChanged?.Invoke(QueueChange.Changed, tier, index);
			}
			return value.pickupIndex;
		}

		private static bool TryMerge(ItemTier tier, int into, int from)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			List<QueueEntry> list = mainQueues[tier];
			if (into < 0 || into >= list.Count || from < 0 || from >= list.Count)
			{
				return false;
			}
			QueueEntry value = list[into];
			QueueEntry queueEntry = list[from];
			if (value.pickupIndex != queueEntry.pickupIndex)
			{
				return false;
			}
			value.count += queueEntry.count;
			list[into] = value;
			list.RemoveAt(from);
			return true;
		}

		public static void Move(ItemTier tier, int oldIndex, int newIndex, int count = 1)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: 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_00e4: Unknown result type (might be due to invalid IL or missing references)
			List<QueueEntry> list = mainQueues[tier];
			newIndex = Math.Max(0, Math.Min(list.Count, newIndex));
			if (newIndex == oldIndex)
			{
				return;
			}
			QueueEntry item = list[oldIndex];
			if (item.count < count)
			{
				return;
			}
			if (item.count == count)
			{
				list.RemoveAt(oldIndex);
				if (newIndex > oldIndex)
				{
					newIndex--;
				}
			}
			else
			{
				QueueEntry value = list[oldIndex];
				value.count -= count;
				list[oldIndex] = value;
			}
			item.count = count;
			if (TryMerge(tier, oldIndex - 1, oldIndex) && newIndex > oldIndex)
			{
				newIndex--;
			}
			list.Insert(newIndex, item);
			TryMerge(tier, newIndex - 1, newIndex);
			TryMerge(tier, newIndex, newIndex + 1);
			QueueManager.OnQueueChanged?.Invoke(QueueChange.Moved, tier, -1);
		}

		public static IEnumerable<(ItemTier, PickupIndex)> PeekAll()
		{
			return from entry in mainQueues
				where entry.Value.Count > 0
				select (entry.Key, entry.Value.First().pickupIndex);
		}
	}
	internal class UIManager : MonoBehaviour
	{
		private struct ButtonWrapper
		{
			public HGButton hgButton { get; private set; }

			public TextMeshProUGUI textComponent { get; private set; }

			public RectTransform rectTransform { get; private set; }

			public LanguageTextMeshController languageTextMeshController { get; private set; }

			public ButtonClickedEvent _onClick => ((Button)hgButton).onClick;

			public string text
			{
				get
				{
					return languageTextMeshController.token;
				}
				set
				{
					languageTextMeshController.token = value;
				}
			}

			public string directText
			{
				get
				{
					TextMeshProUGUI obj = textComponent;
					return (obj != null) ? ((TMP_Text)obj).text : null;
				}
				set
				{
					((TMP_Text)textComponent).text = value;
				}
			}

			public event UnityAction onClick
			{
				add
				{
					((UnityEvent)_onClick).AddListener(value);
				}
				remove
				{
					((UnityEvent)_onClick).RemoveListener(value);
				}
			}

			public ButtonWrapper(HGButton button)
			{
				hgButton = button;
				textComponent = ((Component)button).GetComponentInChildren<TextMeshProUGUI>();
				rectTransform = ((Component)button).GetComponent<RectTransform>();
				languageTextMeshController = ((Component)button).GetComponent<LanguageTextMeshController>();
			}
		}

		private static readonly GameObject commandUIPrefab;

		private static readonly GameObject commandCancelButton;

		private static readonly PickupPickerPanel prefabPickupPickerPanel;

		private static readonly GameObject commandItemButton;

		private static readonly GameObject commandItemContainer;

		private static Texture2D repeatIconTexture;

		private static readonly MethodInfo PickupPickerController_GetOptionsFromPickupIndex;

		private static readonly Color selectedColorMult;

		private Sprite missingUnlockIcon;

		private GameObject itemIconPrefab;

		private ItemInventoryDisplay itemInventoryDisplayPrefab;

		private ScoreboardController scoreboard;

		private HUD hud;

		private GameObject container;

		private GameObject origContainer;

		private ColorBlock origButtonColors;

		private ColorBlock selectedButtonColors;

		private ButtonWrapper scoreboardButton;

		private ButtonWrapper queueButton;

		private ItemTier lastActiveTab = (ItemTier)0;

		private GameObject queueContainer;

		private readonly Dictionary<ItemTier, GameObject> queueDisplays = new Dictionary<ItemTier, GameObject>();

		private readonly Dictionary<ItemTier, ButtonWrapper> queueButtons = new Dictionary<ItemTier, ButtonWrapper>();

		private bool displayingQueues;

		private ItemTier selectedQueue = (ItemTier)0;

		private readonly List<GameObject> uiElements = new List<GameObject>();

		private bool DisplayingQueues
		{
			get
			{
				return displayingQueues;
			}
			set
			{
				if (displayingQueues == value)
				{
					return;
				}
				if (Object.op_Implicit((Object)(object)origContainer) && Object.op_Implicit((Object)(object)queueContainer))
				{
					if (value)
					{
						container.SetActive(false);
						queueContainer.SetActive(true);
					}
					else
					{
						container.SetActive(true);
						queueContainer.SetActive(false);
					}
				}
				displayingQueues = value;
				UpdateButtonColors();
			}
		}

		private ItemTier SelectedQueue
		{
			get
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				return selectedQueue;
			}
			set
			{
				//IL_0002: 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_0019: 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_0045: 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_0062: Unknown result type (might be due to invalid IL or missing references)
				//IL_0063: Unknown result type (might be due to invalid IL or missing references)
				if (selectedQueue != value)
				{
					queueDisplays[selectedQueue].SetActive(false);
					queueDisplays[value].SetActive(true);
					TransitionEnabledButton(queueButtons[selectedQueue], queueButtons[value]);
					selectedQueue = value;
				}
			}
		}

		static UIManager()
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			PickupPickerController_GetOptionsFromPickupIndex = typeof(PickupPickerController).GetMethod("GetOptionsFromPickupIndex", BindingFlags.Static | BindingFlags.NonPublic);
			selectedColorMult = new Color(0.3f, 0.3f, 0.3f);
			commandUIPrefab = CommandArtifactManager.commandCubePrefab.GetComponent<PickupPickerController>().panelPrefab;
			commandCancelButton = ((Component)commandUIPrefab.GetComponentsInChildren<HGButton>().First((HGButton a) => ((Object)a).name == "CancelButton")).gameObject;
			prefabPickupPickerPanel = commandUIPrefab.GetComponent<PickupPickerPanel>();
			commandItemButton = prefabPickupPickerPanel.buttonPrefab;
			commandItemContainer = ((Component)prefabPickupPickerPanel.buttonContainer).gameObject;
		}

		private static void CopyRectTransform(RectTransform dest, RectTransform source)
		{
			//IL_0003: 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_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: 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)
			dest.anchorMin = source.anchorMin;
			dest.anchorMax = source.anchorMax;
			dest.anchoredPosition = source.anchoredPosition;
			((Transform)dest).position = ((Transform)source).position;
			dest.sizeDelta = source.sizeDelta;
		}

		private static void ReparentChildren(Transform dest, Transform source, bool keepWorldPos = false, Action<Transform> additionalAction = null)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			List<Transform> list = new List<Transform>();
			foreach (Transform item in source)
			{
				Transform val = item;
				if ((Object)(object)val != (Object)(object)dest)
				{
					list.Add(val);
				}
			}
			foreach (Transform item2 in list)
			{
				item2.SetParent(dest, keepWorldPos);
				additionalAction?.Invoke(item2);
			}
		}

		private static IEnumerator ExecuteNextFrameInner(Action action)
		{
			yield return 0;
			action();
		}

		private void ExecuteNextFrame(Action action)
		{
			((MonoBehaviour)this).StartCoroutine(ExecuteNextFrameInner(action));
		}

		private ButtonWrapper CreateButton(GameObject parent = null, UnityAction onClick = null, string text = null)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Expected O, but got Unknown
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Expected O, but got Unknown
			GameObject val = Object.Instantiate<GameObject>(commandCancelButton, (parent != null) ? parent.transform : null);
			uiElements.Add(val);
			HGButton component = val.GetComponent<HGButton>();
			((MPButton)component).onSelect = new UnityEvent();
			((MPButton)component).onDeselect = new UnityEvent();
			((Button)component).onClick = new ButtonClickedEvent();
			ButtonWrapper result = new ButtonWrapper(component);
			if (text != null)
			{
				result.text = text;
			}
			if (onClick != null)
			{
				result.onClick += onClick;
			}
			return result;
		}

		private void MarkButton(ButtonWrapper button, bool state)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: 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)
			((Selectable)button.hgButton).colors = (state ? selectedButtonColors : origButtonColors);
			((Graphic)button.hgButton.imageOnHover).color = (state ? selectedColorMult : Color.white);
		}

		private void TransitionEnabledButton(ButtonWrapper from, ButtonWrapper to)
		{
			MarkButton(from, state: false);
			MarkButton(to, state: true);
		}

		private void UpdateButtonColors()
		{
			if (Object.op_Implicit((Object)(object)queueButton.hgButton) && Object.op_Implicit((Object)(object)scoreboardButton.hgButton))
			{
				ButtonWrapper to;
				ButtonWrapper from;
				if (DisplayingQueues)
				{
					to = queueButton;
					from = scoreboardButton;
				}
				else
				{
					to = scoreboardButton;
					from = queueButton;
				}
				TransitionEnabledButton(from, to);
			}
		}

		private void PrintObject(GameObject obj, bool components = false, int depth = 0)
		{
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Expected O, but got Unknown
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append(' ', depth * 2);
			stringBuilder.Append(((object)obj).ToString());
			Debug.Log((object)stringBuilder.ToString());
			if (components)
			{
				Component[] components2 = obj.GetComponents<Component>();
				foreach (Component val in components2)
				{
					stringBuilder.Clear();
					stringBuilder.Append(' ', depth * 2);
					stringBuilder.Append('-');
					stringBuilder.Append(((object)val).ToString());
					Debug.Log((object)stringBuilder.ToString());
				}
			}
			foreach (Transform item in obj.transform)
			{
				Transform val2 = item;
				PrintObject(((Component)val2).gameObject, components, depth + 1);
			}
		}

		private PickupIndex GetPickupIndexOfItemTier(ItemTier itemTier)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: 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_0035: Expected I4, but got Unknown
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: 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_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			List<PickupIndex> list = null;
			switch ((int)itemTier)
			{
			case 0:
				list = Run.instance.availableTier1DropList;
				break;
			case 1:
				list = Run.instance.availableTier2DropList;
				break;
			case 2:
				list = Run.instance.availableTier3DropList;
				break;
			case 4:
				list = Run.instance.availableBossDropList;
				break;
			case 3:
				list = Run.instance.availableLunarItemDropList;
				break;
			case 6:
				list = Run.instance.availableVoidTier1DropList;
				break;
			case 7:
				list = Run.instance.availableVoidTier2DropList;
				break;
			case 8:
				list = Run.instance.availableVoidTier3DropList;
				break;
			case 9:
				list = Run.instance.availableVoidBossDropList;
				break;
			}
			return list?.FirstOrDefault() ?? PickupIndex.none;
		}

		private RectTransform CreateQueueContainer(ItemTier itemTier, RectTransform parent, Action<PickupIndex> callback)
		{
			//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_0022: 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_004a: Expected O, but got Unknown
			//IL_00a3: 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_00d1: 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_00ff: 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_012f: Expected O, but got Unknown
			//IL_014d: 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_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: 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_01dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e3: Expected O, but got Unknown
			//IL_0208: Unknown result type (might be due to invalid IL or missing references)
			//IL_021f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0236: Unknown result type (might be due to invalid IL or missing references)
			//IL_025f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0299: 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_040e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0429: Unknown result type (might be due to invalid IL or missing references)
			//IL_0444: Unknown result type (might be due to invalid IL or missing references)
			//IL_045f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0472: Unknown result type (might be due to invalid IL or missing references)
			//IL_0478: Unknown result type (might be due to invalid IL or missing references)
			//IL_032d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0341: Unknown result type (might be due to invalid IL or missing references)
			//IL_035c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0377: Unknown result type (might be due to invalid IL or missing references)
			//IL_0392: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0492: Unknown result type (might be due to invalid IL or missing references)
			//IL_0497: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject($"{itemTier}QueueContainer", new Type[1] { typeof(RectTransform) });
			Transform transform = val.transform;
			RectTransform val2 = (RectTransform)(object)((transform is RectTransform) ? transform : null);
			((Transform)val2).SetParent((Transform)(object)parent, false);
			GameObject val3 = Object.Instantiate<GameObject>(((Component)itemInventoryDisplayPrefab).gameObject, (Transform)(object)val2, false);
			Object.DestroyImmediate((Object)(object)val3.GetComponent<ItemInventoryDisplay>());
			Object.DestroyImmediate((Object)(object)val3.GetComponent<LayoutElement>());
			Transform transform2 = val3.transform;
			RectTransform val4 = (RectTransform)(object)((transform2 is RectTransform) ? transform2 : null);
			val4.anchorMin = new Vector2(0f, 1f);
			val4.anchorMax = new Vector2(1f, 1f);
			val4.sizeDelta = new Vector2(-60f, 50f);
			val4.anchoredPosition = new Vector2(0f, -5f);
			val4.pivot = new Vector2(0f, 1f);
			ButtonWrapper repeatButton = default(ButtonWrapper);
			repeatButton = CreateButton(val, (UnityAction)delegate
			{
				//IL_0002: 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)
				QueueManager.ToggleRepeat(itemTier);
				MarkButton(repeatButton, QueueManager.DoesRepeat(itemTier));
			}, "");
			RectTransform rectTransform = repeatButton.rectTransform;
			rectTransform.anchorMin = new Vector2(1f, 1f);
			rectTransform.anchorMax = new Vector2(1f, 1f);
			rectTransform.sizeDelta = new Vector2(55f, 55f);
			rectTransform.anchoredPosition = new Vector2(0f, -2.5f);
			rectTransform.pivot = new Vector2(1f, 1f);
			GameObject val5 = new GameObject($"{itemTier}RepeatButtonImageHolder", new Type[1] { typeof(RectTransform) });
			Transform transform3 = val5.transform;
			RectTransform val6 = (RectTransform)(object)((transform3 is RectTransform) ? transform3 : null);
			((Transform)val6).SetParent((Transform)(object)rectTransform, false);
			val6.anchorMin = new Vector2(0f, 0f);
			val6.anchorMax = new Vector2(1f, 1f);
			val6.sizeDelta = new Vector2(-15f, -15f);
			RawImage val7 = val5.AddComponent<RawImage>();
			val7.texture = (Texture)(object)repeatIconTexture;
			MarkButton(repeatButton, QueueManager.DoesRepeat(itemTier));
			QueueDisplay queueDisplay = val3.AddComponent<QueueDisplay>();
			queueDisplay.itemIconPrefab = itemIconPrefab;
			queueDisplay.itemIconPrefabWidth = itemInventoryDisplayPrefab.itemIconPrefabWidth;
			queueDisplay.tier = itemTier;
			GameObject val8 = Object.Instantiate<GameObject>(commandItemContainer, (Transform)(object)val2, false);
			RectTransform itemButtonsTransform = default(RectTransform);
			ref RectTransform reference = ref itemButtonsTransform;
			Transform transform4 = val8.transform;
			reference = (RectTransform)(object)((transform4 is RectTransform) ? transform4 : null);
			GridLayoutGroup component = val8.GetComponent<GridLayoutGroup>();
			UIElementAllocator<MPButton> val9 = new UIElementAllocator<MPButton>(itemButtonsTransform, commandItemButton, true, false);
			if (AutoCommandQueuePickup.config.bigItemButtonContainer.Value)
			{
				Object.Destroy((Object)(object)val8.GetComponent<RawImage>());
				component.constraint = (Constraint)0;
				component.startCorner = (Corner)0;
				component.startAxis = (Axis)0;
				((LayoutGroup)component).childAlignment = (TextAnchor)1;
				component.cellSize *= AutoCommandQueuePickup.config.bigItemButtonScale.Value;
				itemButtonsTransform.anchoredPosition = new Vector2(0f, 0f);
				itemButtonsTransform.anchorMin = new Vector2(0f, 0f);
				itemButtonsTransform.anchorMax = new Vector2(1f, 1f);
				itemButtonsTransform.sizeDelta = new Vector2(0f, -55f);
				itemButtonsTransform.pivot = new Vector2(0.5f, 0f);
			}
			else
			{
				component.constraint = (Constraint)1;
				component.constraintCount = prefabPickupPickerPanel.maxColumnCount;
				((LayoutGroup)component).childAlignment = (TextAnchor)1;
				itemButtonsTransform.anchorMin = new Vector2(0.5f, 1f);
				itemButtonsTransform.anchorMax = new Vector2(0.5f, 1f);
				itemButtonsTransform.anchoredPosition = new Vector2(0f, -55f);
				itemButtonsTransform.pivot = new Vector2(0f, 1f);
				itemButtonsTransform.sizeDelta = default(Vector2);
			}
			Option[] itemOptions = (Option[])PickupPickerController_GetOptionsFromPickupIndex.Invoke(null, new object[1] { GetPickupIndexOfItemTier(itemTier) });
			if (itemOptions != null)
			{
				val9.onCreateElement = delegate(int index, MPButton button)
				{
					//IL_0008: Unknown result type (might be due to invalid IL or missing references)
					//IL_000d: Unknown result type (might be due to invalid IL or missing references)
					//IL_000e: Unknown result type (might be due to invalid IL or missing references)
					//IL_000f: 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_009f: Unknown result type (might be due to invalid IL or missing references)
					//IL_0054: 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)
					//IL_007c: Unknown result type (might be due to invalid IL or missing references)
					//IL_008f: Unknown result type (might be due to invalid IL or missing references)
					//IL_0099: Expected O, but got Unknown
					Option val10 = itemOptions[index];
					PickupDef pickupDef = PickupCatalog.GetPickupDef(val10.pickupIndex);
					Image component2 = ((Component)((Component)button).GetComponent<ChildLocator>().FindChild("Icon")).GetComponent<Image>();
					if (val10.available && pickupDef != null)
					{
						((Graphic)component2).color = Color.white;
						component2.sprite = pickupDef.iconSprite;
						((Selectable)button).interactable = true;
						PickupIndex pickupIndex = pickupDef.pickupIndex;
						((UnityEvent)((Button)button).onClick).AddListener((UnityAction)delegate
						{
							//IL_000d: Unknown result type (might be due to invalid IL or missing references)
							callback(pickupIndex);
							LayoutRebuilder.MarkLayoutForRebuild(itemButtonsTransform);
						});
					}
					else
					{
						((Graphic)component2).color = Color.gray;
						component2.sprite = missingUnlockIcon;
						((Selectable)button).interactable = false;
					}
				};
				val9.AllocateElements(itemOptions.Length);
			}
			return val2;
		}

		private void DestroyUI()
		{
			foreach (GameObject uiElement in uiElements)
			{
				Object.Destroy((Object)(object)uiElement);
			}
			uiElements.Clear();
			if ((Object)(object)container != (Object)null)
			{
				RectTransform component = container.GetComponent<RectTransform>();
				RectTransform component2 = origContainer.GetComponent<RectTransform>();
				ReparentChildren((Transform)(object)component2, (Transform)(object)component);
				Object.Destroy((Object)(object)container);
				Object.Destroy((Object)(object)queueContainer);
				container = null;
			}
		}

		private void RebuildUI()
		{
			//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_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_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_0031: 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_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: 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_0084: 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_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Expected O, but got Unknown
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: 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_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Expected O, but got Unknown
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0448: Unknown result type (might be due to invalid IL or missing references)
			//IL_044e: Unknown result type (might be due to invalid IL or missing references)
			//IL_046b: Unknown result type (might be due to invalid IL or missing references)
			//IL_048b: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_04be: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c8: Expected O, but got Unknown
			//IL_04ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_04f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0511: Unknown result type (might be due to invalid IL or missing references)
			//IL_0531: Unknown result type (might be due to invalid IL or missing references)
			//IL_0549: Unknown result type (might be due to invalid IL or missing references)
			//IL_054f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0564: Unknown result type (might be due to invalid IL or missing references)
			//IL_056e: Expected O, but got Unknown
			//IL_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_027c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0288: Expected O, but got Unknown
			//IL_029c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_032f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0346: Unknown result type (might be due to invalid IL or missing references)
			//IL_0355: Unknown result type (might be due to invalid IL or missing references)
			//IL_035b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0367: Unknown result type (might be due to invalid IL or missing references)
			//IL_036d: Unknown result type (might be due to invalid IL or missing references)
			//IL_038d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0397: Expected O, but got Unknown
			//IL_03a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ba: Unknown result type (might be due to invalid IL or missing references)
			DestroyUI();
			origButtonColors = ((Selectable)commandCancelButton.GetComponent<HGButton>()).colors;
			ColorBlock val = origButtonColors;
			((ColorBlock)(ref val)).disabledColor = ((ColorBlock)(ref val)).disabledColor * selectedColorMult;
			((ColorBlock)(ref val)).pressedColor = ((ColorBlock)(ref val)).pressedColor * selectedColorMult;
			Color val2 = default(Color);
			((Color)(ref val2))..ctor(0.7f, 0.55f, 0.1f, 1f);
			((ColorBlock)(ref val)).normalColor = val2;
			((ColorBlock)(ref val)).highlightedColor = val2;
			selectedButtonColors = val;
			container = new GameObject("CommandQueueScoreboardWrapper", new Type[1] { typeof(RectTransform) });
			RectTransform component = container.GetComponent<RectTransform>();
			origContainer = ((Component)scoreboard).gameObject;
			RectTransform component2 = origContainer.GetComponent<RectTransform>();
			((Transform)component).SetParent((Transform)(object)component2, false);
			component.sizeDelta = new Vector2(0f, 0f);
			component.anchorMin = new Vector2(0f, 0f);
			component.anchorMax = new Vector2(1f, 0.9f);
			ReparentChildren((Transform)(object)component, (Transform)(object)component2);
			queueContainer = new GameObject("CommandQueueContainer", new Type[1] { typeof(RectTransform) });
			Transform transform = queueContainer.transform;
			RectTransform val3 = (RectTransform)(object)((transform is RectTransform) ? transform : null);
			((Transform)val3).SetParent((Transform)(object)component2, false);
			CopyRectTransform(val3, component);
			Dictionary<ItemTier, string> dictionary = new Dictionary<ItemTier, string>
			{
				{
					(ItemTier)0,
					"White"
				},
				{
					(ItemTier)1,
					"Green"
				},
				{
					(ItemTier)2,
					"Red"
				}
			};
			object[] array = (from a in AutoCommandQueuePickup.config.enabledTabsConfig
				where a.Value
				select Enum.Parse(typeof(ItemTier), ((ConfigEntryBase)a).Definition.Key)).ToArray();
			float num = (float)array.Length + 1f;
			int num2 = 0;
			object[] array2 = array;
			for (int i = 0; i < array2.Length; i++)
			{
				ItemTier tier = (ItemTier)array2[i];
				string text = (dictionary.ContainsKey(tier) ? dictionary[tier] : ((object)(ItemTier)(ref tier)).ToString());
				string text2 = text;
				ButtonWrapper value = CreateButton(queueContainer, (UnityAction)delegate
				{
					//IL_0008: Unknown result type (might be due to invalid IL or missing references)
					SelectedQueue = tier;
				}, text2);
				value.rectTransform.anchorMin = new Vector2((float)num2 / num, 8f / 9f);
				value.rectTransform.anchorMax = new Vector2((float)(num2 + 1) / num, 1f);
				value.rectTransform.anchoredPosition = default(Vector2);
				value.rectTransform.sizeDelta = default(Vector2);
				RectTransform val4 = CreateQueueContainer(tier, val3, delegate(PickupIndex index)
				{
					//IL_0001: Unknown result type (might be due to invalid IL or missing references)
					QueueManager.Enqueue(index);
				});
				val4.anchorMin = new Vector2(0f, 0f);
				val4.anchorMax = new Vector2(1f, 8f / 9f);
				val4.sizeDelta = default(Vector2);
				val4.anchoredPosition = default(Vector2);
				((Component)val4).gameObject.SetActive(false);
				value.onClick += (UnityAction)delegate
				{
					//IL_0008: Unknown result type (might be due to invalid IL or missing references)
					//IL_000d: Unknown result type (might be due to invalid IL or missing references)
					lastActiveTab = tier;
				};
				queueDisplays[tier] = ((Component)val4).gameObject;
				queueButtons[tier] = value;
				num2++;
			}
			selectedQueue = lastActiveTab;
			queueDisplays[selectedQueue].SetActive(true);
			ExecuteNextFrame(delegate
			{
				//IL_0009: Unknown result type (might be due to invalid IL or missing references)
				MarkButton(queueButtons[selectedQueue], state: true);
			});
			queueContainer.SetActive(false);
			scoreboardButton = CreateButton(origContainer, null, "Scoreboard");
			scoreboardButton.rectTransform.anchoredPosition = default(Vector2);
			scoreboardButton.rectTransform.anchorMin = new Vector2(0f, 0.9f);
			scoreboardButton.rectTransform.anchorMax = new Vector2(0.333f, 1f);
			scoreboardButton.rectTransform.sizeDelta = default(Vector2);
			scoreboardButton.onClick += (UnityAction)delegate
			{
				DisplayingQueues = false;
			};
			queueButton = CreateButton(origContainer, null, "Command Queue");
			queueButton.rectTransform.anchoredPosition = default(Vector2);
			queueButton.rectTransform.anchorMin = new Vector2(0.333f, 0.9f);
			queueButton.rectTransform.anchorMax = new Vector2(0.667f, 1f);
			queueButton.rectTransform.sizeDelta = default(Vector2);
			queueButton.onClick += (UnityAction)delegate
			{
				DisplayingQueues = true;
			};
			ExecuteNextFrame(delegate
			{
				UpdateButtonColors();
			});
		}

		public void Awake()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			if (!AutoCommandQueuePickup.IsLoaded)
			{
				Object.Destroy((Object)(object)this);
				return;
			}
			repeatIconTexture = new Texture2D(0, 0);
			using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("AutoCommandQueuePickup.repeat-solid.png"))
			{
				using MemoryStream memoryStream = new MemoryStream();
				stream.CopyTo(memoryStream);
				byte[] array = memoryStream.ToArray();
				ImageConversion.LoadImage(repeatIconTexture, array);
			}
			scoreboard = ((Component)this).GetComponent<ScoreboardController>();
			hud = ((Component)this).GetComponentInParent<HUD>();
			missingUnlockIcon = Resources.Load<Sprite>("Textures/MiscIcons/texUnlockIcon");
			itemInventoryDisplayPrefab = scoreboard.stripPrefab.GetComponent<ScoreboardStrip>().itemInventoryDisplay;
			itemIconPrefab = itemInventoryDisplayPrefab.itemIconPrefab;
			AutoCommandQueuePickup.PluginUnloaded = (Action)Delegate.Combine(AutoCommandQueuePickup.PluginUnloaded, (Action)delegate
			{
				Object.DestroyImmediate((Object)(object)this);
			});
		}

		private void OnDestroy()
		{
			DestroyUI();
			Object.Destroy((Object)(object)repeatIconTexture);
		}

		private void OnEnable()
		{
			if ((Object)(object)container == (Object)null)
			{
				RebuildUI();
			}
		}
	}
	public abstract class ItemDistributor
	{
		public delegate bool TargetFilter(CharacterMaster target);

		protected ItemDistributor(AutoCommandQueuePickup plugin)
		{
			UpdateTargets();
		}

		public abstract CharacterMaster GetTarget(Vector3 position, PickupIndex pickupIndex, TargetFilter extraFilter = null);

		public void DestributeCommandItem(ref CreatePickupInfo pickupInfo, TargetFilter extraFilter = null)
		{
			//IL_0003: 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_0029: 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)
			CharacterMaster target = GetTarget(pickupInfo.position, ((CreatePickupInfo)(ref pickupInfo)).pickupIndex, extraFilter);
			if (!((Object)(object)target == (Object)null))
			{
				pickupInfo.position = ((Component)target).transform.position;
			}
		}

		public void DistributeItem(GenericPickupController item, TargetFilter extraFilter = null)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			CharacterMaster target = GetTarget(((Component)item).transform.position, item.pickupIndex, extraFilter);
			if (!((Object)(object)target == (Object)null))
			{
				AutoCommandQueuePickup.GrantItem(item, target);
			}
		}

		public abstract void UpdateTargets();

		public virtual bool IsValid()
		{
			return true;
		}

		protected bool IsValidTarget(CharacterMaster master)
		{
			return AutoCommandQueuePickup.config.CheckTarget(master);
		}

		protected bool IsValidTarget(PlayerCharacterMasterController player)
		{
			return (Object)(object)player != (Object)null && IsValidTarget(player.master);
		}

		protected List<PlayerCharacterMasterController> GetValidTargets()
		{
			return PlayerCharacterMasterController.instances.Where(IsValidTarget).ToList();
		}

		public static ItemDistributor GetItemDistributor(Mode mode, AutoCommandQueuePickup plugin)
		{
			return mode switch
			{
				Mode.Closest => new ClosestDistributor(plugin), 
				Mode.LeastItems => new LeastItemsDistributor(plugin), 
				Mode.Random => new RandomDistributor(plugin), 
				_ => new SequentialDistributor(plugin), 
			};
		}
	}
	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);
		}
	}
	public class OverrideDistributorBehaviour : MonoBehaviour
	{
		public ItemDistributor Distributor;
	}
	public static class SaveAndLoad
	{
		public static void Load(string path)
		{
			//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_009b: 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)
			if (!File.Exists(path))
			{
				return;
			}
			string value = File.ReadAllText(path).Trim();
			if (string.IsNullOrEmpty(value))
			{
				return;
			}
			QueueManager.UpdateQueueAvailability();
			try
			{
				using StreamReader streamReader = new StreamReader(path);
				string text;
				while ((text = streamReader.ReadLine()) != null)
				{
					if (text == "")
					{
						continue;
					}
					string[] array = text.Split(new char[1] { ',' });
					ItemTier tier = (ItemTier)Enum.Parse(typeof(ItemTier), array[0]);
					if (Convert.ToBoolean(array[1]))
					{
						QueueManager.ToggleRepeat(tier);
					}
					for (int i = 2; i < array.Length; i++)
					{
						if (!string.IsNullOrEmpty(array[i]))
						{
							string[] array2 = array[i].Split(new char[1] { '*' });
							for (int j = 0; j < int.Parse(array2[1]); j++)
							{
								QueueManager.Enqueue(new PickupIndex(Convert.ToInt32(array2[0])));
							}
						}
					}
				}
			}
			catch (Exception data)
			{
				Log.Debug(data);
			}
		}

		public static void Save(string path)
		{
			//IL_002a: 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_002f: 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_008a: 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)
			try
			{
				string text = "";
				ItemTier[] array = (ItemTier[])Enum.GetValues(typeof(ItemTier));
				ItemTier[] array2 = array;
				for (int i = 0; i < array2.Length; i++)
				{
					ItemTier val = array2[i];
					QueueManager.Peek(val);
					if (false)
					{
						continue;
					}
					text = text + ((object)(ItemTier)(ref val)).ToString() + "," + QueueManager.DoesRepeat(val) + ",";
					foreach (QueueManager.QueueEntry item in QueueManager.mainQueues[val])
					{
						text += $"{item.pickupIndex.value}*{item.count},";
					}
					text += "\n";
				}
				if (!File.Exists(path))
				{
					File.Create(path).Dispose();
				}
				using StreamWriter streamWriter = new StreamWriter(path);
				streamWriter.WriteLine(text);
				streamWriter.Dispose();
			}
			catch (Exception data)
			{
				Log.Debug(data);
			}
		}
	}
}
namespace AutoCommandQueuePickup.ItemDistributors
{
	internal class ClosestDistributor : ItemDistributor
	{
		private CharacterMaster[] targets;

		public ClosestDistributor(AutoCommandQueuePickup plugin)
			: base(plugin)
		{
		}

		public override void UpdateTargets()
		{
			targets = (from player in GetValidTargets()
				select player.master).ToArray();
		}

		public override CharacterMaster GetTarget(Vector3 position, PickupIndex pickupIndex, TargetFilter extraFilter = null)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: 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_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: 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_0065: Unknown result type (might be due to invalid IL or missing references)
			CharacterMaster result = null;
			float num = float.MaxValue;
			CharacterMaster[] array = targets;
			foreach (CharacterMaster val in array)
			{
				if (extraFilter == null || extraFilter(val))
				{
					Vector3 val2 = (val.hasBody ? val.GetBodyObject().transform.position : val.deathFootPosition);
					Vector3 val3 = position - val2;
					float sqrMagnitude = ((Vector3)(ref val3)).sqrMagnitude;
					if (sqrMagnitude < num)
					{
						result = val;
						num = sqrMagnitude;
					}
				}
			}
			return result;
		}
	}
	internal class FixedTargetDistributor : ItemDistributor
	{
		private readonly CharacterMaster target;

		public FixedTargetDistributor(AutoCommandQueuePickup plugin, PlayerCharacterMasterController target)
			: this(plugin, target.master)
		{
		}

		public FixedTargetDistributor(AutoCommandQueuePickup plugin, CharacterMaster target)
			: base(plugin)
		{
			this.target = target;
		}

		public override bool IsValid()
		{
			return IsValidTarget(target);
		}

		public override void UpdateTargets()
		{
		}

		public override CharacterMaster GetTarget(Vector3 position, PickupIndex pickupIndex, TargetFilter extraFilter = null)
		{
			if (extraFilter != null && !extraFilter(target))
			{
				return null;
			}
			return target;
		}
	}
	internal class LeastItemsDistributor : ItemDistributor
	{
		private CharacterMaster[] targets;

		public LeastItemsDistributor(AutoCommandQueuePickup plugin)
			: base(plugin)
		{
		}

		public override void UpdateTargets()
		{
			List<PlayerCharacterMasterController> validTargets = GetValidTargets();
			targets = (CharacterMaster[])(object)new CharacterMaster[validTargets.Count];
			for (int i = 0; i < validTargets.Count; i++)
			{
				PlayerCharacterMasterController val = validTargets[i];
				targets[i] = val.master;
			}
		}

		public override CharacterMaster GetTarget(Vector3 position, PickupIndex pickupIndex, TargetFilter extraFilter = null)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: 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)
			//IL_0039: 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)
			CharacterMaster result = null;
			int num = int.MaxValue;
			PickupDef pickupDef = PickupCatalog.GetPickupDef(pickupIndex);
			if (pickupDef == null)
			{
				return targets.First();
			}
			ItemTier tier = ItemCatalog.GetItemDef(pickupDef.itemIndex).tier;
			CharacterMaster[] array = targets;
			foreach (CharacterMaster val in array)
			{
				if (extraFilter == null || extraFilter(val))
				{
					int totalItemCountOfTier = val.inventory.GetTotalItemCountOfTier(tier);
					if (totalItemCountOfTier < num)
					{
						result = val;
						num = totalItemCountOfTier;
					}
				}
			}
			return result;
		}
	}
	internal class RandomDistributor : ItemDistributor
	{
		private CharacterMaster[] targets;

		public RandomDistributor(AutoCommandQueuePickup plugin)
			: base(plugin)
		{
		}

		public override void UpdateTargets()
		{
			targets = (from pcmc in GetValidTargets()
				select pcmc.master).ToArray();
		}

		public override CharacterMaster GetTarget(Vector3 position, PickupIndex pickupIndex, TargetFilter extraFilter = null)
		{
			IEnumerable<CharacterMaster> source = targets.AsEnumerable();
			if (extraFilter != null)
			{
				source = source.Where((CharacterMaster target) => extraFilter(target));
			}
			CharacterMaster[] array = source.ToArray();
			return array.ElementAtOrDefault(Random.Range(0, array.Length));
		}
	}
	internal class SequentialDistributor : ItemDistributor
	{
		private int index;

		private CharacterMaster[] playerDistribution;

		public SequentialDistributor(AutoCommandQueuePickup plugin)
			: base(plugin)
		{
		}

		public override void UpdateTargets()
		{
			CharacterMaster[] array = playerDistribution;
			CharacterMaster val = ((array != null) ? array[index] : null);
			List<PlayerCharacterMasterController> validTargets = GetValidTargets();
			playerDistribution = (CharacterMaster[])(object)new CharacterMaster[validTargets.Count];
			index = -1;
			for (int i = 0; i < validTargets.Count; i++)
			{
				PlayerCharacterMasterController val2 = validTargets[i];
				playerDistribution[i] = val2.master;
				if ((Object)(object)val2.master == (Object)(object)val)
				{
					index = i;
				}
			}
			if (index == -1)
			{
				index = Random.Range(0, playerDistribution.Length);
			}
		}

		public override CharacterMaster GetTarget(Vector3 position, PickupIndex pickupIndex, TargetFilter extraFilter = null)
		{
			if (playerDistribution.Length == 0)
			{
				return null;
			}
			CharacterMaster result = null;
			if (extraFilter != null)
			{
				for (int i = 0; i < playerDistribution.Length; i++)
				{
					CharacterMaster val = playerDistribution[(index + i) % playerDistribution.Length];
					if (extraFilter(val))
					{
						result = val;
						index = (index + i + 1) % playerDistribution.Length;
						break;
					}
				}
			}
			else
			{
				result = playerDistribution[index];
				index = ++index % playerDistribution.Length;
			}
			return result;
		}
	}
}
namespace AutoCommandQueuePickup.Configuration
{
	public class Config
	{
		public class ItemTierSet : SortedSet<ItemTier>
		{
			public static string Serialize(ItemTierSet self)
			{
				return string.Join(", ", self.Select((ItemTier x) => ((object)(ItemTier)(ref x)).ToString()));
			}

			public static ItemTierSet Deserialize(string src)
			{
				//IL_005d: Unknown result type (might be due to invalid IL or missing references)
				ItemTierSet itemTierSet = new ItemTierSet();
				foreach (string item in from s in src.Split(new char[1] { ',' })
					select s.Trim())
				{
					int result2;
					if (Enum.TryParse<ItemTier>(item, out ItemTier result))
					{
						itemTierSet.Add(result);
					}
					else if (int.TryParse(item, out result2))
					{
						itemTierSet.Add((ItemTier)result2);
					}
				}
				return itemTierSet;
			}

			public static string SerializeForConfig(string self)
			{
				return Serialize(Deserialize(self));
			}

			public override string ToString()
			{
				return Serialize(this);
			}
		}

		public readonly AutoCommandQueuePickup Plugin;

		private readonly ManualLogSource logger;

		public ConfigEntry<Mode> distributionMode;

		public ConfigEntry<Distribution> timeOfDistribution;

		public ItemFilter OnDrop;

		public ItemFilter OnTeleport;

		public ConfigEntry<bool> overrideScrapper;

		public ConfigEntry<bool> overridePrinter;

		public ConfigEntry<string> enabledTabs;

		public List<ConfigEntry<bool>> enabledTabsConfig = new List<ConfigEntry<bool>>();

		public ConfigEntry<bool> bigItemButtonContainer;

		public ConfigEntry<float> bigItemButtonScale;

		public ConfigEntry<bool> rightClickRemovesStack;

		public ConfigMigrator migrator;

		public Texture2D ModIcon;

		public readonly string saveDirectory = Path.Combine(Application.persistentDataPath, "AutoCommandQueuePickup");

		private const string fileName = "commandQueueSlot_";

		private const string extension = "csv";

		public static int totalItems;

		public ConfigFile config => ((BaseUnityPlugin)Plugin).Config;

		private bool OnDropReady => OnDrop?.Ready ?? false;

		private bool OnTeleportReady => OnTeleport?.Ready ?? false;

		public bool Ready => OnDropReady && OnTeleportReady;

		public event Action OnConfigReady;

		public Config(AutoCommandQueuePickup plugin, ManualLogSource _logger)
		{
			//IL_0117: 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_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Expected O, but got Unknown
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: Expected O, but got Unknown
			//IL_01b0: Expected O, but got Unknown
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e5: Expected O, but got Unknown
			//IL_01e5: Expected O, but got Unknown
			//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_020c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0216: Expected O, but got Unknown
			//IL_0216: Expected O, but got Unknown
			//IL_0328: Unknown result type (might be due to invalid IL or missing references)
			//IL_032d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0353: Unknown result type (might be due to invalid IL or missing references)
			//IL_037e: Expected O, but got Unknown
			//IL_0382: Unknown result type (might be due to invalid IL or missing references)
			//IL_038c: Expected O, but got Unknown
			Plugin = plugin;
			logger = _logger;
			migrator = new ConfigMigrator(config, this);
			OnTeleport = new ItemFilter("OnTeleportFilter", config);
			OnDrop = new ItemFilter("OnDropFilter", config);
			distributionMode = config.Bind<Mode>("AutoItemPickup", "DistributionMode", Mode.Sequential, "Decide how to distribute items among the players\r\n            Sequential - Goes over all players, giving each of them one item\r\n            Random - Chooses which player receives the item randomly\r\n            Closest - Gives the item to the nearest player\r\n            LeastItems - Gives the item to the player with least total items of the item's tier");
			timeOfDistribution = config.Bind<Distribution>("AutoItemPickup", "TimeOfDistribution", Distribution.OnDrop, "When should items be distributed?\r\n            OnTeleport - When the teleporter is charged\r\n            OnDrop - Immediately when the item drops");
			overrideScrapper = config.Bind<bool>("AutoItemPickup", "OverrideScrapper", true, "Should items dropped by scrappers be distributed?");
			overridePrinter = config.Bind<bool>("AutoItemPickup", "OverridePrinter", true, "Should items dropped by 3D printers be distributed?");
			ItemTier[] array = (ItemTier[])Enum.GetValues(typeof(ItemTier));
			ItemTier[] array2 = array;
			foreach (ItemTier val in array2)
			{
				ConfigEntry<bool> val2 = config.Bind<bool>("CommandQueue", $"{val}", true, new ConfigDescription($"Should {val} items be queued?", (AcceptableValueBase)null, Array.Empty<object>()));
				val2.SettingChanged += UpdateSettings;
				enabledTabsConfig.Add(val2);
			}
			bigItemButtonContainer = config.Bind<bool>(new ConfigDefinition("UI", "BigItemSelectionContainer"), true, new ConfigDescription("false: Default command button layout\ntrue: Increase the space for buttons, helps avoid overflow with modded items", (AcceptableValueBase)null, Array.Empty<object>()));
			bigItemButtonScale = config.Bind<float>(new ConfigDefinition("UI", "BigItemSelectionScale"), 1f, new ConfigDescription("Scale applied to item buttons in the menu - decrease it if your buttons don't fit\nApplies only if BigItemSelectionContainer is true", (AcceptableValueBase)null, Array.Empty<object>()));
			rightClickRemovesStack = config.Bind<bool>(new ConfigDefinition("UI", "RightClickRemovesStack"), true, new ConfigDescription("Should right-clicking an item in the queue remove the whole stack?", (AcceptableValueBase)null, Array.Empty<object>()));
			overridePrinter.SettingChanged += UpdateSettings;
			overrideScrapper.SettingChanged += UpdateSettings;
			distributionMode.SettingChanged += UpdateSettings;
			timeOfDistribution.SettingChanged += UpdateSettings;
			bigItemButtonContainer.SettingChanged += UpdateSettings;
			bigItemButtonScale.SettingChanged += UpdateSettings;
			rightClickRemovesStack.SettingChanged += UpdateSettings;
			config.SettingChanged += ConfigOnSettingChanged;
			OnTeleport.OnReady += CheckReadyStatus;
			OnDrop.OnReady += CheckReadyStatus;
			OnConfigReady += DoMigrationIfReady;
			TomlTypeConverter.AddConverter(typeof(ItemTierSet), new TypeConverter
			{
				ConvertToObject = (string str, Type type) => ItemTierSet.Deserialize(str),
				ConvertToString = (object obj, Type type) => obj.ToString()
			});
			ModIcon = new Texture2D(2, 2);
			using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("AutoCommandQueuePickup.icon.png"))
			{
				using MemoryStream memoryStream = new MemoryStream();
				stream.CopyTo(memoryStream);
				byte[] array3 = memoryStream.ToArray();
				ImageConversion.LoadImage(ModIcon, array3);
			}
			if (!Directory.Exists(saveDirectory))
			{
				Directory.CreateDirectory(saveDirectory);
			}
			CreateRiskOfOptionsConfig();
			DoMigrationIfReady();
		}

		public void CreateRiskOfOptionsConfig()
		{
			//IL_0034: 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_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Expected O, but got Unknown
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Expected O, but got Unknown
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Expected O, but got Unknown
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Expected O, but got Unknown
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Expected O, but got Unknown
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: 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_0107: Expected O, but got Unknown
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Expected O, but got Unknown
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Expected O, but got Unknown
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Expected O, but got Unknown
			ModSettingsManager.SetModDescription("Automatically pickups up items that drop as well as CommandCubes if the command queue has been populated (Plus ProperSave Integration!)");
			ModSettingsManager.SetModIcon(Sprite.Create(ModIcon, new Rect(0f, 0f, (float)((Texture)ModIcon).width, (float)((Texture)ModIcon).height), new Vector2(0.5f, 0.5f)));
			ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)distributionMode));
			ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)timeOfDistribution));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(overrideScrapper));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(overridePrinter));
			foreach (ConfigEntry<bool> item in enabledTabsConfig)
			{
				ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(item));
			}
			ModSettingsManager.SetModDescriptionToken("AUTO_COMMAND_QUEUE_PICKUP_DESCRIPTION");
			ModSettingsManager.AddOption((BaseOption)new SliderOption(bigItemButtonScale, new SliderConfig
			{
				min = 0.1f,
				max = 2f
			}));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(bigItemButtonContainer));
			ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(rightClickRemovesStack));
		}

		private void CheckReadyStatus()
		{
			if (Ready)
			{
				this.OnConfigReady?.Invoke();
			}
		}

		private void DoMigrationIfReady()
		{
			if (Ready && migrator.NeedsMigration)
			{
				migrator.DoMigration();
			}
		}

		public bool CheckTarget(CharacterMaster master)
		{
			return (Object)(object)master != (Object)null && master.hasBody;
		}

		public bool ShouldDistribute(PickupIndex index, Cause cause)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Invalid comparison between Unknown and I4
			//IL_0021: 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)
			PickupDef pickupDef = PickupCatalog.GetPickupDef(index);
			if (pickupDef == null || (int)pickupDef.itemIndex == -1)
			{
				return false;
			}
			ItemDef itemDef = ItemCatalog.GetItemDef(pickupDef.itemIndex);
			if ((Object)(object)itemDef == (Object)null)
			{
				return false;
			}
			ItemFilter itemFilter = ((cause == Cause.Drop) ? OnDrop : OnTeleport);
			return itemFilter.CheckFilter(itemDef.itemIndex);
		}

		public bool ShouldDistributeCommand(PickupIndex index, Cause cause)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Invalid comparison between Unknown and I4
			//IL_0021: 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)
			PickupDef pickupDef = PickupCatalog.GetPickupDef(index);
			if (pickupDef == null || (int)pickupDef.itemIndex == -1)
			{
				return false;
			}
			ItemDef itemDef = ItemCatalog.GetItemDef(pickupDef.itemIndex);
			if ((Object)(object)itemDef == (Object)null)
			{
				return false;
			}
			ItemFilter itemFilter = ((cause == Cause.Drop) ? OnDrop : OnTeleport);
			return itemFilter.CheckFilterTier(itemDef.tier);
		}

		private void ConfigOnSettingChanged(object sender, SettingChangedEventArgs e)
		{
			if (e.ChangedSetting.SettingType == typeof(ItemSet))
			{
				ConfigEntry<ItemSet> val = (ConfigEntry<ItemSet>)(object)e.ChangedSetting;
				ItemSet value = val.Value;
				IList<string> parseErrors = value.ParseErrors;
				if (parseErrors != null && parseErrors.Count > 0)
				{
					string text = "Errors found when parsing " + ((ConfigEntryBase)val).Definition.Key + " for " + ((ConfigEntryBase)val).Definition.Section + ":\n\t" + string.Join("\n\t", value.ParseErrors);
					logger.LogWarning((object)text);
				}
			}
		}

		public void UpdateSettings(object sender, EventArgs e)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected I4, but got Unknown
			SettingChangedEventArgs val = (SettingChangedEventArgs)(object)((e is SettingChangedEventArgs) ? e : null);
			if (val != null)
			{
				if (Enum.TryParse<ItemTier>(val.ChangedSetting.Definition.Key, out ItemTier result))
				{
					enabledTabsConfig[(int)result].Value = Convert.ToBoolean(val.ChangedSetting.BoxedValue);
				}
				else if (val.ChangedSetting.Definition.Key == "BigItemSelectionContainer")
				{
					bigItemButtonContainer.Value = Convert.ToBoolean(val.ChangedSetting.BoxedValue);
				}
				else if (val.ChangedSetting.Definition.Key == "BigItemSelectionScale")
				{
					bigItemButtonScale.Value = Convert.ToSingle(val.ChangedSetting.BoxedValue);
				}
				else if (val.ChangedSetting.Definition.Key == "RightClickRemovesStack")
				{
					rightClickRemovesStack.Value = Convert.ToBoolean(val.ChangedSetting.BoxedValue);
				}
				else if (val.ChangedSetting.Definition.Key == "OverridePrinter")
				{
					overridePrinter.Value = Convert.ToBoolean(val.ChangedSetting.BoxedValue);
				}
				else if (val.ChangedSetting.Definition.Key == "OverrideScrapper")
				{
					overrideScrapper.Value = Convert.ToBoolean(val.ChangedSetting.BoxedValue);
				}
				else if (val.ChangedSetting.Definition.Key == "DistributionMode")
				{
					distributionMode.Value = (Mode)Enum.Parse(typeof(Mode), val.ChangedSetting.BoxedValue.ToString());
				}
				else if (val.ChangedSetting.Definition.Key == "TimeOfDistribution")
				{
					timeOfDistribution.Value = (Distribution)Enum.Parse(typeof(Distribution), val.ChangedSetting.BoxedValue.ToString());
				}
			}
			QueueManager.UpdateQueueAvailability();
		}

		public So