Decompiled source of DroneToOrbItem v1.0.0

DroneToOrbItem.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using UnityEngine;

[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.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("zabu")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("zabumod")]
[assembly: AssemblyTitle("zabumod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace REPOJP.DroneToOrbItem
{
	[BepInPlugin("REPOJP.DroneToOrbItem", "DroneToOrbItem", "1.0.0")]
	public sealed class DroneToOrbItemPlugin : BaseUnityPlugin
	{
		public const string PluginGuid = "REPOJP.DroneToOrbItem";

		public const string PluginName = "DroneToOrbItem";

		public const string PluginVersion = "1.0.0";

		internal static ManualLogSource Log = null;

		internal static DroneToOrbItemPlugin Instance = null;

		private Harmony harmony = null;

		internal static bool Registered;

		internal static readonly List<UnlockDefinition> Definitions = new List<UnlockDefinition>();

		internal static readonly Dictionary<string, Item> RealItemsByInternalName = new Dictionary<string, Item>(StringComparer.Ordinal);

		internal static readonly Dictionary<string, itemVolume> OriginalItemVolumes = new Dictionary<string, itemVolume>(StringComparer.Ordinal);

		internal static readonly Dictionary<string, int> PlannedCounts = new Dictionary<string, int>(StringComparer.Ordinal);

		internal static int GuaranteedRegularSlots;

		internal static int GuaranteedHealthPackSlots;

		internal static ConfigEntry<bool> CfgCountPurchasedAgainstMax = null;

		internal static ConfigEntry<float> CfgCommonOrbBatteryDrainRate = null;

		internal static ConfigEntry<float> CfgOrbBatteryExtraDrainRate = null;

		internal static ConfigEntry<float> CfgOrbHealRate = null;

		internal static ConfigEntry<int> CfgOrbHealAmount = null;

		private void Awake()
		{
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Expected O, but got Unknown
			Instance = this;
			Log = ((BaseUnityPlugin)this).Logger;
			((BaseUnityPlugin)this).Logger.LogInfo((object)"\r\n█████████████████████████████████████████████████████████████████████████████████████████████\r\n▄▄▄▄▄▄                          ▄▄▄▄▄▄▄▄▄      ▄▄▄▄▄         ▄▄    ▄▄▄▄▄                     \r\n███▀▀██▄                        ▀▀▀███▀▀▀    ▄███████▄       ██     ███  ██                  \r\n███  ███ ████▄ ▄███▄ ████▄ ▄█▀█▄   ███ ▄███▄ ███   ███ ████▄ ████▄  ███ ▀██▀▀ ▄█▀█▄ ███▄███▄ \r\n███  ███ ██ ▀▀ ██ ██ ██ ██ ██▄█▀   ███ ██ ██ ███▄▄▄███ ██ ▀▀ ██ ██  ███  ██   ██▄█▀ ██ ██ ██ \r\n██████▀  ██    ▀███▀ ██ ██ ▀█▄▄▄   ███ ▀███▀  ▀█████▀  ██    ████▀ ▄███▄ ██   ▀█▄▄▄ ██ ██ ██ \r\n                                                                                             \r\n█████████████████████████████████████████████████████████████████████████████████████████████\r\n");
			try
			{
				((Component)this).transform.parent = null;
				((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
				Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
				InitializeGlobalConfig();
				InitializeDefinitions();
				harmony = new Harmony("REPOJP.DroneToOrbItem");
				harmony.PatchAll();
				Log.LogInfo((object)"Loaded");
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Failure: Awake\n" + ex));
			}
		}

		private void OnDestroy()
		{
			try
			{
				if (harmony != null)
				{
					harmony.UnpatchSelf();
				}
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Failure: OnDestroy\n" + ex));
			}
		}

		private void InitializeGlobalConfig()
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: 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_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Expected O, but got Unknown
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Expected O, but got Unknown
			CfgCountPurchasedAgainstMax = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Count Purchased Against Max", true, "If true, purchased count is subtracted from the per-shop maximum. 購入済み数をショップ最大個数から差し引くかどうか");
			CfgCommonOrbBatteryDrainRate = ((BaseUnityPlugin)this).Config.Bind<float>("Orb Common", "Common Orb Battery Drain Rate", 0.1f, new ConfigDescription("Fallback common battery drain rate for orb items. オーブ系アイテムの共通消費量の既定値", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 100f), Array.Empty<object>()));
			CfgOrbBatteryExtraDrainRate = ((BaseUnityPlugin)this).Config.Bind<float>("Orb Battery", "Orb Battery Extra Drain Rate", 1.5f, new ConfigDescription("Additional battery drain used by Orb Battery when it charges targets. Orb Batteryが対象を充電した時の追加消費量", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 100f), Array.Empty<object>()));
			CfgOrbHealRate = ((BaseUnityPlugin)this).Config.Bind<float>("Orb Heal", "Orb Heal Rate", 2f, new ConfigDescription("Heal interval in seconds for Orb Heal. Orb Healの回復間隔 秒", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 100f), Array.Empty<object>()));
			CfgOrbHealAmount = ((BaseUnityPlugin)this).Config.Bind<int>("Orb Heal", "Orb Heal Amount", 10, new ConfigDescription("Heal amount per tick for Orb Heal. Orb Healの1回あたり回復量", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 1000), Array.Empty<object>()));
		}

		private void InitializeDefinitions()
		{
			if (Definitions.Count <= 0)
			{
				Definitions.Add(new UnlockDefinition((BaseUnityPlugin)(object)this, "Orb Battery", "Item Orb Battery", "Charges nearby battery items while active", "起動中に周囲のバッテリー系アイテムを充電", (itemType)1, typeof(ItemOrbBattery), 1, 10, createHealSlotConfig: false, 1f, 0));
				Definitions.Add(new UnlockDefinition((BaseUnityPlugin)(object)this, "Orb Feather", "Item Orb Feather", "Makes nearby players and objects lighter while active", "起動中に周囲のプレイヤーや物体を軽くする", (itemType)1, typeof(ItemOrbFeather), 1, 10, createHealSlotConfig: false, 1f, 0));
				Definitions.Add(new UnlockDefinition((BaseUnityPlugin)(object)this, "Orb Heal", "Item Orb Heal", "Heals the player while active", "起動中にプレイヤーを回復", (itemType)1, typeof(ItemOrbHeal), 1, 10, createHealSlotConfig: true, 1f, 20));
				Definitions.Add(new UnlockDefinition((BaseUnityPlugin)(object)this, "Orb Indestructible", "Item Orb Indestructible", "Makes nearby objects indestructible while active", "起動中に周囲の物体へ無敵効果を付与", (itemType)1, typeof(ItemOrbIndestructible), 1, 10, createHealSlotConfig: false, 1f, 0));
				Definitions.Add(new UnlockDefinition((BaseUnityPlugin)(object)this, "Orb Magnet", "Item Orb Magnet", "Pulls nearby objects toward itself while active", "起動中に周囲の物体を引き寄せ", (itemType)1, typeof(ItemOrbMagnet), 1, 10, createHealSlotConfig: false, 1f, 20));
				Definitions.Add(new UnlockDefinition((BaseUnityPlugin)(object)this, "Orb Torque", "Item Orb Torque", "Applies sticky control to nearby objects while active", "起動中に周囲の物体へ粘着的な制御を付与", (itemType)1, typeof(ItemOrbTorque), 1, 0, createHealSlotConfig: false, 1f, 0));
			}
		}

		internal static List<Item> CollectAllItems()
		{
			Dictionary<string, Item> dictionary = new Dictionary<string, Item>(StringComparer.OrdinalIgnoreCase);
			try
			{
				Item[] array = Resources.LoadAll<Item>(string.Empty);
				for (int i = 0; i < array.Length; i++)
				{
					RegisterItemToMap(dictionary, array[i]);
				}
			}
			catch (Exception ex)
			{
				Log.LogError((object)("Failure: Resources.LoadAll<Item>\n" + ex));
			}
			try
			{
				Item[] array2 = Resources.FindObjectsOfTypeAll<Item>();
				for (int j = 0; j < array2.Length; j++)
				{
					RegisterItemToMap(dictionary, array2[j]);
				}
			}
			catch (Exception ex2)
			{
				Log.LogError((object)("Failure: Resources.FindObjectsOfTypeAll<Item>\n" + ex2));
			}
			return new List<Item>(dictionary.Values);
		}

		private static void RegisterItemToMap(Dictionary<string, Item> map, Item item)
		{
			if (!((Object)(object)item == (Object)null))
			{
				string uniqueItemKey = GetUniqueItemKey(item);
				if (!string.IsNullOrEmpty(uniqueItemKey) && !map.ContainsKey(uniqueItemKey))
				{
					map.Add(uniqueItemKey, item);
				}
			}
		}

		internal static string GetUniqueItemKey(Item item)
		{
			if ((Object)(object)item == (Object)null)
			{
				return string.Empty;
			}
			string prefabResourcePath = GetPrefabResourcePath(item);
			if (!string.IsNullOrEmpty(prefabResourcePath))
			{
				return prefabResourcePath;
			}
			if (!string.IsNullOrEmpty(((Object)item).name))
			{
				return ((Object)item).name;
			}
			if (!string.IsNullOrEmpty(item.itemName))
			{
				return item.itemName;
			}
			return string.Empty;
		}

		internal static string GetPrefabResourcePath(Item item)
		{
			try
			{
				if ((Object)(object)item != (Object)null && item.prefab != null && !string.IsNullOrEmpty(item.prefab.ResourcePath))
				{
					return item.prefab.ResourcePath;
				}
			}
			catch
			{
			}
			return string.Empty;
		}

		internal static string GetItemDisplayName(Item item)
		{
			if ((Object)(object)item == (Object)null)
			{
				return "Unknown";
			}
			if (!string.IsNullOrEmpty(item.itemName))
			{
				return item.itemName;
			}
			if (!string.IsNullOrEmpty(((Object)item).name))
			{
				return ((Object)item).name;
			}
			return "Unknown";
		}
	}
	internal sealed class UnlockDefinition
	{
		public string DisplayName;

		public string InternalName;

		public string DescriptionEn;

		public string DescriptionJa;

		public itemType DefaultItemType;

		public Type ComponentType;

		public ConfigEntry<bool> CfgEnabled;

		public ConfigEntry<int> CfgMaxInShop;

		public ConfigEntry<int> CfgChancePercent;

		public ConfigEntry<int> CfgPriceDelta;

		public ConfigEntry<bool> CfgHealUseHealthPackSlot;

		public ConfigEntry<float> CfgOrbRadius;

		public ConfigEntry<float> CfgOrbBatteryDrainRate;

		public ConfigEntry<bool> CfgAllowThroughWalls;

		public ConfigEntry<bool> CfgOnlyActiveWhileHeld;

		public UnlockDefinition(BaseUnityPlugin plugin, string displayName, string internalName, string descriptionEn, string descriptionJa, itemType defaultItemType, Type componentType, int defaultMaxInShop, int defaultChancePercent, bool createHealSlotConfig, float defaultRadius, int defaultPriceDelta)
		{
			//IL_0027: 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_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: 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_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Expected O, but got Unknown
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Expected O, but got Unknown
			//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d9: Expected O, but got Unknown
			DisplayName = displayName;
			InternalName = internalName;
			DescriptionEn = descriptionEn;
			DescriptionJa = descriptionJa;
			DefaultItemType = defaultItemType;
			ComponentType = componentType;
			CfgEnabled = plugin.Config.Bind<bool>("Enabled", displayName + " Enabled", true, displayName + " enabled in shop rolls. ショップ抽選対象に含めるかどうか");
			CfgMaxInShop = plugin.Config.Bind<int>("Shop Max Amount", displayName + " Max Amount In Shop", defaultMaxInShop, new ConfigDescription(displayName + " maximum possible amount per shop roll. 1回のショップ抽選で出現しうる最大個数", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 10), Array.Empty<object>()));
			CfgChancePercent = plugin.Config.Bind<int>("Shop Spawn Chance", displayName + " Spawn Chance Percent", defaultChancePercent, new ConfigDescription(displayName + " shop appearance chance percent. ショップ出現確率パーセント", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
			CfgPriceDelta = plugin.Config.Bind<int>("Shop Price Delta", displayName + " Price Delta", defaultPriceDelta, new ConfigDescription(displayName + " price delta added to the generated shop price. 生成されたショップ価格へ加算減算する差分", (AcceptableValueBase)(object)new AcceptableValueRange<int>(-50, 50), Array.Empty<object>()));
			if (createHealSlotConfig)
			{
				CfgHealUseHealthPackSlot = plugin.Config.Bind<bool>("Orb Heal", "Orb Heal Use HealthPack Slot", false, "Use health-pack slot behavior for Orb Heal. Orb Healをヘルスパック枠扱いにするかどうか");
			}
			CfgOrbRadius = plugin.Config.Bind<float>("Orb Radius", displayName + " Radius", defaultRadius, new ConfigDescription(displayName + " effect radius. Visual effect size follows this radius automatically. 効果範囲サイズ 表示エフェクトサイズも自動追従", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 100f), Array.Empty<object>()));
			CfgOrbBatteryDrainRate = plugin.Config.Bind<float>("Orb Individual Battery Drain", displayName + " Battery Drain Rate", 0.1f, new ConfigDescription(displayName + " individual common battery drain override. 各オーブ個別の共通消費量上書き", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 100f), Array.Empty<object>()));
			CfgAllowThroughWalls = plugin.Config.Bind<bool>("Orb Through Walls", displayName + " Allow Through Walls", true, displayName + " can affect targets through walls. 壁越しでも効果を適用するかどうか");
			CfgOnlyActiveWhileHeld = plugin.Config.Bind<bool>("Orb Held Only", displayName + " Only Active While Held", false, displayName + " works only while the item is being held. 持っている時だけ有効にするかどうか");
		}
	}
	[HarmonyPatch]
	internal static class DroneToOrbItemPatches
	{
		private static readonly FieldInfo ItemAttributesValueField = AccessTools.Field(typeof(ItemAttributes), "value");

		private static readonly FieldInfo ItemAttributesShopItemField = AccessTools.Field(typeof(ItemAttributes), "shopItem");

		private static readonly FieldInfo ItemOrbRadiusOriginalField = AccessTools.Field(typeof(ItemOrb), "orbRadiusOriginal");

		private static readonly FieldInfo ItemOrbObjectAffectedField = AccessTools.Field(typeof(ItemOrb), "objectAffected");

		private static readonly FieldInfo ItemOrbLocalPlayerAffectedField = AccessTools.Field(typeof(ItemOrb), "localPlayerAffected");

		private static readonly FieldInfo ItemOrbHealRateField = AccessTools.Field(typeof(ItemOrbHeal), "healRate");

		private static readonly FieldInfo ItemOrbHealAmountField = AccessTools.Field(typeof(ItemOrbHeal), "healAmount");

		private static int originalItemSpawnTargetAmount;

		private static int originalItemHealthPacksAmount;

		[HarmonyPostfix]
		[HarmonyPatch(typeof(StatsManager), "RunStartStats")]
		private static void StatsManager_RunStartStats_Postfix()
		{
			if (IsHostAuthority())
			{
				TryRegisterTargets();
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(StatsManager), "ResetAllStats")]
		private static void StatsManager_ResetAllStats_Postfix()
		{
			if (IsHostAuthority())
			{
				DroneToOrbItemPlugin.Registered = false;
				TryRegisterTargets();
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(ShopManager), "ShopInitialize")]
		private static void ShopManager_ShopInitialize_Prefix()
		{
			if (IsHostAuthority())
			{
				DroneToOrbItemPlugin.PlannedCounts.Clear();
				DroneToOrbItemPlugin.GuaranteedRegularSlots = 0;
				DroneToOrbItemPlugin.GuaranteedHealthPackSlots = 0;
				TryRegisterTargets();
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(ShopManager), "GetAllItemsFromStatsManager")]
		private static void ShopManager_GetAllItemsFromStatsManager_Postfix(ShopManager __instance)
		{
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Invalid comparison between Unknown and I4
			if (!IsHostAuthority())
			{
				return;
			}
			try
			{
				if ((Object)(object)__instance == (Object)null || (Object)(object)StatsManager.instance == (Object)null)
				{
					return;
				}
				TryRegisterTargets();
				DroneToOrbItemPlugin.PlannedCounts.Clear();
				DroneToOrbItemPlugin.GuaranteedRegularSlots = 0;
				DroneToOrbItemPlugin.GuaranteedHealthPackSlots = 0;
				RemoveTargetItemsFromPotentialLists(__instance);
				foreach (UnlockDefinition definition in DroneToOrbItemPlugin.Definitions)
				{
					if (!definition.CfgEnabled.Value)
					{
						LogShopRoll(definition, 0, "disabled");
						continue;
					}
					Item val = FindRegisteredItemByDefinition(definition);
					if ((Object)(object)val == (Object)null)
					{
						DroneToOrbItemPlugin.Log.LogWarning((object)("Failure: Registered item not found - " + definition.InternalName));
						continue;
					}
					ApplyPerShopSettings(val, definition);
					int num = CalculatePlannedCount(val, definition);
					DroneToOrbItemPlugin.PlannedCounts[((Object)val).name] = num;
					if (num > 0)
					{
						AddItemToCorrectPotentialList(__instance, val, num);
						if (definition.CfgChancePercent.Value >= 100)
						{
							if ((int)val.itemType == 8)
							{
								DroneToOrbItemPlugin.GuaranteedHealthPackSlots++;
							}
							else
							{
								DroneToOrbItemPlugin.GuaranteedRegularSlots++;
							}
						}
					}
					LogShopRoll(definition, num, ((object)(itemType)(ref val.itemType)).ToString() + " path=" + DroneToOrbItemPlugin.GetPrefabResourcePath(val));
				}
				DroneToOrbItemPlugin.Log.LogInfo((object)("Shop Roll Summary: regularGuaranteed=" + DroneToOrbItemPlugin.GuaranteedRegularSlots + " healthGuaranteed=" + DroneToOrbItemPlugin.GuaranteedHealthPackSlots));
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: ShopManager_GetAllItemsFromStatsManager_Postfix\n" + ex));
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(PunManager), "ShopPopulateItemVolumes")]
		private static void PunManager_ShopPopulateItemVolumes_Prefix()
		{
			if (!IsHostAuthority())
			{
				return;
			}
			try
			{
				if (!((Object)(object)ShopManager.instance == (Object)null))
				{
					originalItemSpawnTargetAmount = ShopManager.instance.itemSpawnTargetAmount;
					originalItemHealthPacksAmount = ShopManager.instance.itemHealthPacksAmount;
					ShopManager instance = ShopManager.instance;
					instance.itemSpawnTargetAmount += DroneToOrbItemPlugin.GuaranteedRegularSlots;
					ShopManager instance2 = ShopManager.instance;
					instance2.itemHealthPacksAmount += DroneToOrbItemPlugin.GuaranteedHealthPackSlots;
				}
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: PunManager_ShopPopulateItemVolumes_Prefix\n" + ex));
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(PunManager), "ShopPopulateItemVolumes")]
		private static void PunManager_ShopPopulateItemVolumes_Postfix()
		{
			if (!IsHostAuthority())
			{
				return;
			}
			try
			{
				if (!((Object)(object)ShopManager.instance == (Object)null))
				{
					ShopManager.instance.itemSpawnTargetAmount = originalItemSpawnTargetAmount;
					ShopManager.instance.itemHealthPacksAmount = originalItemHealthPacksAmount;
				}
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: PunManager_ShopPopulateItemVolumes_Postfix\n" + ex));
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(ItemAttributes), "GetValue")]
		private static void ItemAttributes_GetValue_Postfix(ItemAttributes __instance)
		{
			if (!IsHostAuthority())
			{
				return;
			}
			try
			{
				if ((Object)(object)__instance == (Object)null || (Object)(object)__instance.item == (Object)null || !GetShopItemFlag(__instance))
				{
					return;
				}
				UnlockDefinition unlockDefinition = FindDefinitionByItem(__instance.item);
				if (unlockDefinition != null && unlockDefinition.CfgEnabled.Value)
				{
					int itemAttributesValue = GetItemAttributesValue(__instance);
					int num = Mathf.Clamp(unlockDefinition.CfgPriceDelta.Value, -20, 20);
					int num2 = Mathf.Max(0, itemAttributesValue + num);
					SetItemAttributesValue(__instance, num2);
					PhotonView component = ((Component)__instance).GetComponent<PhotonView>();
					if ((Object)(object)component != (Object)null && PhotonNetwork.IsMasterClient)
					{
						component.RPC("GetValueRPC", (RpcTarget)1, new object[1] { num2 });
					}
				}
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: ItemAttributes_GetValue_Postfix\n" + ex));
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(ItemOrb), "Update")]
		private static void ItemOrb_Update_Prefix(ItemOrb __instance)
		{
			if (!IsHostAuthority())
			{
				return;
			}
			try
			{
				if ((Object)(object)__instance == (Object)null)
				{
					return;
				}
				UnlockDefinition unlockDefinition = FindDefinitionByGameObject(((Component)__instance).gameObject);
				if (unlockDefinition != null)
				{
					float num = (__instance.orbRadius = Mathf.Max(0.01f, unlockDefinition.CfgOrbRadius.Value));
					if (ItemOrbRadiusOriginalField != null)
					{
						ItemOrbRadiusOriginalField.SetValue(__instance, num);
					}
					ItemBattery component = ((Component)__instance).GetComponent<ItemBattery>();
					if ((Object)(object)component != (Object)null)
					{
						component.batteryDrainRate = (__instance.batteryDrainRate = Mathf.Max(0f, unlockDefinition.CfgOrbBatteryDrainRate.Value));
					}
				}
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: ItemOrb_Update_Prefix\n" + ex));
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(ItemOrb), "OrbConstantLogic")]
		private static bool ItemOrb_OrbConstantLogic_Prefix(ItemOrb __instance)
		{
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_0294: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if ((Object)(object)__instance == (Object)null)
				{
					return false;
				}
				if (!IsHostAuthority())
				{
					SetObjectAffected(__instance, new List<PhysGrabObject>());
					SetLocalPlayerAffected(__instance, value: false);
					return false;
				}
				ItemBattery component = ((Component)__instance).GetComponent<ItemBattery>();
				if ((Object)(object)component == (Object)null)
				{
					SetObjectAffected(__instance, new List<PhysGrabObject>());
					SetLocalPlayerAffected(__instance, value: false);
					return false;
				}
				if (component.batteryLifeInt == 0 || component.batteryLife <= 0f || !__instance.itemActive)
				{
					SetObjectAffected(__instance, new List<PhysGrabObject>());
					SetLocalPlayerAffected(__instance, value: false);
					return false;
				}
				UnlockDefinition unlockDefinition = FindDefinitionByGameObject(((Component)__instance).gameObject);
				if (unlockDefinition == null)
				{
					return true;
				}
				PhysGrabObject component2 = ((Component)__instance).GetComponent<PhysGrabObject>();
				bool flag = (Object)(object)component2 != (Object)null && component2.grabbed;
				if (unlockDefinition.CfgOnlyActiveWhileHeld.Value && !flag)
				{
					SetObjectAffected(__instance, new List<PhysGrabObject>());
					SetLocalPlayerAffected(__instance, value: false);
					return false;
				}
				bool flag2 = !unlockDefinition.CfgAllowThroughWalls.Value;
				List<PhysGrabObject> list = new List<PhysGrabObject>();
				if (__instance.targetEnemies || __instance.targetNonValuables || __instance.targetValuables)
				{
					List<PhysGrabObject> list2 = SemiFunc.PhysGrabObjectGetAllWithinRange(__instance.orbRadius, ((Component)__instance).transform.position, flag2, LayerMask.op_Implicit(LayerMask.GetMask(new string[2] { "Default", "PhysGrabObject" })), component2);
					ITargetingCondition component3 = ((Component)__instance).GetComponent<ITargetingCondition>();
					for (int i = 0; i < list2.Count; i++)
					{
						PhysGrabObject val = list2[i];
						if (!((Object)(object)val == (Object)null))
						{
							bool flag3 = component3 == null || component3.CustomTargetingCondition(((Component)val).gameObject);
							if (__instance.targetEnemies && val.isEnemy && flag3)
							{
								list.Add(val);
							}
							else if (__instance.targetNonValuables && val.isNonValuable && flag3)
							{
								list.Add(val);
							}
							else if (__instance.targetValuables && val.isValuable && flag3)
							{
								list.Add(val);
							}
						}
					}
				}
				bool value = false;
				if (__instance.targetPlayers)
				{
					value = SemiFunc.LocalPlayerOverlapCheck(__instance.orbRadius, ((Component)__instance).transform.position, flag2);
				}
				SetObjectAffected(__instance, list);
				SetLocalPlayerAffected(__instance, value);
				return false;
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: ItemOrb_OrbConstantLogic_Prefix\n" + ex));
				try
				{
					SetObjectAffected(__instance, new List<PhysGrabObject>());
					SetLocalPlayerAffected(__instance, value: false);
				}
				catch
				{
				}
				return false;
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(ItemOrbHeal), "Start")]
		private static void ItemOrbHeal_Start_Postfix(ItemOrbHeal __instance)
		{
			if (IsHostAuthority())
			{
				ApplyHealOrbConfig(__instance);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(ItemOrbHeal), "Update")]
		private static bool ItemOrbHeal_Update_Prefix(ItemOrbHeal __instance)
		{
			if (!IsHostAuthority())
			{
				return false;
			}
			if ((Object)(object)__instance == (Object)null)
			{
				return false;
			}
			UnlockDefinition unlockDefinition = FindDefinitionByGameObject(((Component)__instance).gameObject);
			if (unlockDefinition != null && unlockDefinition.CfgOnlyActiveWhileHeld.Value)
			{
				PhysGrabObject component = ((Component)__instance).GetComponent<PhysGrabObject>();
				if ((Object)(object)component != (Object)null && !component.grabbed)
				{
					return false;
				}
			}
			ApplyHealOrbConfig(__instance);
			return true;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(ItemOrbBattery), "BatteryDrain")]
		private static bool ItemOrbBattery_BatteryDrain_Prefix(ItemOrbBattery __instance, ref float amount)
		{
			if (!IsHostAuthority())
			{
				return false;
			}
			if ((Object)(object)__instance == (Object)null)
			{
				return false;
			}
			UnlockDefinition unlockDefinition = FindDefinitionByGameObject(((Component)__instance).gameObject);
			if (unlockDefinition != null && unlockDefinition.CfgOnlyActiveWhileHeld.Value)
			{
				PhysGrabObject component = ((Component)__instance).GetComponent<PhysGrabObject>();
				if ((Object)(object)component != (Object)null && !component.grabbed)
				{
					return false;
				}
			}
			amount = Mathf.Max(0f, DroneToOrbItemPlugin.CfgOrbBatteryExtraDrainRate.Value);
			return true;
		}

		private static bool IsHostAuthority()
		{
			try
			{
				return SemiFunc.IsMasterClientOrSingleplayer();
			}
			catch
			{
				return false;
			}
		}

		private static void ApplyHealOrbConfig(ItemOrbHeal itemOrbHeal)
		{
			try
			{
				if (!((Object)(object)itemOrbHeal == (Object)null))
				{
					if (ItemOrbHealRateField != null)
					{
						ItemOrbHealRateField.SetValue(itemOrbHeal, Mathf.Max(0.01f, DroneToOrbItemPlugin.CfgOrbHealRate.Value));
					}
					if (ItemOrbHealAmountField != null)
					{
						ItemOrbHealAmountField.SetValue(itemOrbHeal, Mathf.Max(0, DroneToOrbItemPlugin.CfgOrbHealAmount.Value));
					}
				}
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: ApplyHealOrbConfig\n" + ex));
			}
		}

		private static Item FindRegisteredItemByDefinition(UnlockDefinition definition)
		{
			if (definition == null)
			{
				return null;
			}
			if (DroneToOrbItemPlugin.RealItemsByInternalName.TryGetValue(definition.InternalName, out Item value))
			{
				return value;
			}
			return null;
		}

		private static void TryRegisterTargets()
		{
			try
			{
				if ((Object)(object)StatsManager.instance == (Object)null)
				{
					return;
				}
				if (DroneToOrbItemPlugin.Registered)
				{
					EnsureDictionaryKeysForTargets();
					return;
				}
				List<Item> allItems = DroneToOrbItemPlugin.CollectAllItems();
				foreach (UnlockDefinition definition in DroneToOrbItemPlugin.Definitions)
				{
					RegisterRealExistingItem(definition, allItems);
				}
				DroneToOrbItemPlugin.Registered = true;
				DroneToOrbItemPlugin.Log.LogInfo((object)"Target registration completed");
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: TryRegisterTargets\n" + ex));
			}
		}

		private static void RegisterRealExistingItem(UnlockDefinition definition, List<Item> allItems)
		{
			//IL_0071: 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_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				Item val = FindRealItemByDefinition(definition, allItems);
				if ((Object)(object)val == (Object)null)
				{
					DroneToOrbItemPlugin.Log.LogWarning((object)("Failure: Real item asset not found - " + definition.InternalName));
					return;
				}
				string prefabResourcePath = DroneToOrbItemPlugin.GetPrefabResourcePath(val);
				if (string.IsNullOrEmpty(prefabResourcePath))
				{
					DroneToOrbItemPlugin.Log.LogWarning((object)("Failure: Real item resource path empty - " + definition.InternalName));
					return;
				}
				val.disabled = false;
				val.itemSecretShopType = (itemSecretShopType)0;
				val.physicalItem = true;
				val.maxPurchase = false;
				val.maxPurchaseAmount = 1;
				val.itemType = definition.DefaultItemType;
				val.maxAmountInShop = Mathf.Max(val.maxAmountInShop, 1);
				val.maxAmount = Mathf.Max(val.maxAmount, val.maxAmountInShop);
				if (string.IsNullOrEmpty(val.itemName) || val.itemName == "N/A")
				{
					val.itemName = definition.DisplayName;
				}
				if (string.IsNullOrEmpty(val.description))
				{
					val.description = definition.DescriptionEn + ". " + definition.DescriptionJa;
				}
				if (!DroneToOrbItemPlugin.RealItemsByInternalName.ContainsKey(definition.InternalName))
				{
					DroneToOrbItemPlugin.RealItemsByInternalName.Add(definition.InternalName, val);
				}
				else
				{
					DroneToOrbItemPlugin.RealItemsByInternalName[definition.InternalName] = val;
				}
				if (!DroneToOrbItemPlugin.OriginalItemVolumes.ContainsKey(((Object)val).name))
				{
					DroneToOrbItemPlugin.OriginalItemVolumes.Add(((Object)val).name, val.itemVolume);
				}
				if (!StatsManager.instance.itemDictionary.ContainsKey(((Object)val).name))
				{
					StatsManager.instance.itemDictionary.Add(((Object)val).name, val);
				}
				else
				{
					StatsManager.instance.itemDictionary[((Object)val).name] = val;
				}
				AddMissingDictionaryKeys(((Object)val).name);
				DroneToOrbItemPlugin.Log.LogInfo((object)("Registered real item: " + ((Object)val).name + " path=" + prefabResourcePath));
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: RegisterRealExistingItem " + definition.InternalName + "\n" + ex));
			}
		}

		private static Item FindRealItemByDefinition(UnlockDefinition definition, List<Item> allItems)
		{
			if (definition == null || allItems == null)
			{
				return null;
			}
			for (int i = 0; i < allItems.Count; i++)
			{
				Item val = allItems[i];
				if ((Object)(object)val == (Object)null)
				{
					continue;
				}
				GameObject val2 = null;
				try
				{
					if (val.prefab != null)
					{
						if ((Object)(object)val.prefab.Prefab != (Object)null)
						{
							val2 = val.prefab.Prefab;
						}
						else if (!string.IsNullOrEmpty(val.prefab.ResourcePath))
						{
							val2 = Resources.Load<GameObject>(val.prefab.ResourcePath);
						}
					}
				}
				catch
				{
				}
				if (!((Object)(object)val2 == (Object)null) && (Object)(object)val2.GetComponent(definition.ComponentType) != (Object)null)
				{
					return val;
				}
			}
			return null;
		}

		private static void RemoveTargetItemsFromPotentialLists(ShopManager shopManager)
		{
			if ((Object)(object)shopManager == (Object)null)
			{
				return;
			}
			HashSet<string> targetNames = new HashSet<string>();
			foreach (UnlockDefinition definition in DroneToOrbItemPlugin.Definitions)
			{
				Item val = FindRegisteredItemByDefinition(definition);
				if ((Object)(object)val != (Object)null)
				{
					targetNames.Add(((Object)val).name);
				}
			}
			shopManager.potentialItems.RemoveAll((Item item) => (Object)(object)item != (Object)null && targetNames.Contains(((Object)item).name));
			shopManager.potentialItemConsumables.RemoveAll((Item item) => (Object)(object)item != (Object)null && targetNames.Contains(((Object)item).name));
			shopManager.potentialItemUpgrades.RemoveAll((Item item) => (Object)(object)item != (Object)null && targetNames.Contains(((Object)item).name));
			shopManager.potentialItemHealthPacks.RemoveAll((Item item) => (Object)(object)item != (Object)null && targetNames.Contains(((Object)item).name));
		}

		private static void AddItemToCorrectPotentialList(ShopManager shopManager, Item item, int count)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Invalid comparison between Unknown and I4
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Invalid comparison between Unknown and I4
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Invalid comparison between Unknown and I4
			if ((Object)(object)shopManager == (Object)null || (Object)(object)item == (Object)null || count <= 0)
			{
				return;
			}
			for (int i = 0; i < count; i++)
			{
				if ((int)item.itemType == 8)
				{
					shopManager.potentialItemHealthPacks.Add(item);
				}
				else if ((int)item.itemType == 5)
				{
					shopManager.potentialItemConsumables.Add(item);
				}
				else if ((int)item.itemType == 3)
				{
					shopManager.potentialItemUpgrades.Add(item);
				}
				else
				{
					shopManager.potentialItems.Add(item);
				}
			}
		}

		private static void ApplyPerShopSettings(Item item, UnlockDefinition definition)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)item == (Object)null || definition == null)
			{
				return;
			}
			item.disabled = false;
			item.itemSecretShopType = (itemSecretShopType)0;
			item.physicalItem = true;
			item.maxPurchase = false;
			item.maxPurchaseAmount = 1;
			if (definition.ComponentType == typeof(ItemOrbHeal) && definition.CfgHealUseHealthPackSlot != null)
			{
				if (definition.CfgHealUseHealthPackSlot.Value)
				{
					Item val = FindHealthPackTemplate();
					item.itemType = (itemType)8;
					if ((Object)(object)val != (Object)null)
					{
						item.itemVolume = val.itemVolume;
					}
				}
				else
				{
					item.itemType = definition.DefaultItemType;
					if (DroneToOrbItemPlugin.OriginalItemVolumes.TryGetValue(((Object)item).name, out var value))
					{
						item.itemVolume = value;
					}
				}
			}
			else
			{
				item.itemType = definition.DefaultItemType;
				if (DroneToOrbItemPlugin.OriginalItemVolumes.TryGetValue(((Object)item).name, out var value2))
				{
					item.itemVolume = value2;
				}
			}
			item.maxAmountInShop = Mathf.Clamp(definition.CfgMaxInShop.Value, 1, 10);
			item.maxAmount = Mathf.Max(item.maxAmount, item.maxAmountInShop);
		}

		private static int CalculatePlannedCount(Item item, UnlockDefinition definition)
		{
			try
			{
				if ((Object)(object)item == (Object)null || definition == null || !definition.CfgEnabled.Value)
				{
					return 0;
				}
				int num = SemiFunc.StatGetItemsPurchased(((Object)item).name);
				int num2 = Mathf.Clamp(definition.CfgMaxInShop.Value, 1, 10);
				int num3 = (DroneToOrbItemPlugin.CfgCountPurchasedAgainstMax.Value ? Mathf.Max(0, num2 - num) : num2);
				if (num3 <= 0)
				{
					return 0;
				}
				int num4 = Mathf.Clamp(definition.CfgChancePercent.Value, 1, 100);
				if (num4 >= 100)
				{
					return Random.Range(1, num3 + 1);
				}
				if (Random.Range(0, 100) >= num4)
				{
					return 0;
				}
				return Random.Range(1, num3 + 1);
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: CalculatePlannedCount " + definition.InternalName + "\n" + ex));
				return 0;
			}
		}

		private static void LogShopRoll(UnlockDefinition definition, int count, string categoryText)
		{
			try
			{
				string text = "Shop Roll: " + definition.DisplayName + " enabled=" + definition.CfgEnabled.Value + " count=" + count + " max=" + definition.CfgMaxInShop.Value + " chance=" + definition.CfgChancePercent.Value + " category=" + categoryText + " radius=" + definition.CfgOrbRadius.Value + " drain=" + definition.CfgOrbBatteryDrainRate.Value + " throughWalls=" + definition.CfgAllowThroughWalls.Value + " heldOnly=" + definition.CfgOnlyActiveWhileHeld.Value;
				DroneToOrbItemPlugin.Log.LogInfo((object)text);
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: LogShopRoll\n" + ex));
			}
		}

		private static void EnsureDictionaryKeysForTargets()
		{
			try
			{
				foreach (UnlockDefinition definition in DroneToOrbItemPlugin.Definitions)
				{
					Item val = FindRegisteredItemByDefinition(definition);
					if ((Object)(object)val != (Object)null)
					{
						AddMissingDictionaryKeys(((Object)val).name);
					}
				}
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: EnsureDictionaryKeysForTargets\n" + ex));
			}
		}

		private static void AddMissingDictionaryKeys(string itemName)
		{
			try
			{
				if ((Object)(object)StatsManager.instance == (Object)null || string.IsNullOrEmpty(itemName))
				{
					return;
				}
				foreach (KeyValuePair<string, Dictionary<string, int>> dictionaryOfDictionary in StatsManager.instance.dictionaryOfDictionaries)
				{
					if (dictionaryOfDictionary.Key.StartsWith("item", StringComparison.OrdinalIgnoreCase) && !dictionaryOfDictionary.Value.ContainsKey(itemName))
					{
						dictionaryOfDictionary.Value.Add(itemName, 0);
					}
				}
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: AddMissingDictionaryKeys " + itemName + "\n" + ex));
			}
		}

		private static bool GetShopItemFlag(ItemAttributes itemAttributes)
		{
			try
			{
				if (ItemAttributesShopItemField == null || (Object)(object)itemAttributes == (Object)null)
				{
					return false;
				}
				object value = ItemAttributesShopItemField.GetValue(itemAttributes);
				return value is bool && (bool)value;
			}
			catch
			{
				return false;
			}
		}

		private static int GetItemAttributesValue(ItemAttributes itemAttributes)
		{
			try
			{
				if (ItemAttributesValueField == null || (Object)(object)itemAttributes == (Object)null)
				{
					return 0;
				}
				object value = ItemAttributesValueField.GetValue(itemAttributes);
				return (value is int) ? ((int)value) : 0;
			}
			catch
			{
				return 0;
			}
		}

		private static void SetItemAttributesValue(ItemAttributes itemAttributes, int value)
		{
			try
			{
				if (ItemAttributesValueField != null && (Object)(object)itemAttributes != (Object)null)
				{
					ItemAttributesValueField.SetValue(itemAttributes, value);
				}
			}
			catch
			{
			}
		}

		private static UnlockDefinition FindDefinitionByItem(Item item)
		{
			try
			{
				if ((Object)(object)item == (Object)null)
				{
					return null;
				}
				foreach (UnlockDefinition definition in DroneToOrbItemPlugin.Definitions)
				{
					if (string.Equals(((Object)item).name, definition.InternalName, StringComparison.Ordinal) || string.Equals(item.itemName, definition.DisplayName, StringComparison.Ordinal))
					{
						return definition;
					}
				}
				return null;
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: FindDefinitionByItem\n" + ex));
				return null;
			}
		}

		private static UnlockDefinition FindDefinitionByGameObject(GameObject target)
		{
			try
			{
				if ((Object)(object)target == (Object)null)
				{
					return null;
				}
				foreach (UnlockDefinition definition in DroneToOrbItemPlugin.Definitions)
				{
					if (definition.ComponentType != null && (Object)(object)target.GetComponent(definition.ComponentType) != (Object)null)
					{
						return definition;
					}
				}
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: FindDefinitionByGameObject\n" + ex));
			}
			return null;
		}

		private static Item FindHealthPackTemplate()
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Invalid comparison between Unknown and I4
			try
			{
				if ((Object)(object)StatsManager.instance == (Object)null)
				{
					return null;
				}
				foreach (Item value in StatsManager.instance.itemDictionary.Values)
				{
					if ((Object)(object)value != (Object)null && (int)value.itemType == 8)
					{
						return value;
					}
				}
			}
			catch (Exception ex)
			{
				DroneToOrbItemPlugin.Log.LogError((object)("Failure: FindHealthPackTemplate\n" + ex));
			}
			return null;
		}

		private static void SetObjectAffected(ItemOrb itemOrb, List<PhysGrabObject> list)
		{
			try
			{
				if (ItemOrbObjectAffectedField != null && (Object)(object)itemOrb != (Object)null)
				{
					ItemOrbObjectAffectedField.SetValue(itemOrb, list ?? new List<PhysGrabObject>());
				}
			}
			catch
			{
			}
		}

		private static void SetLocalPlayerAffected(ItemOrb itemOrb, bool value)
		{
			try
			{
				if (ItemOrbLocalPlayerAffectedField != null && (Object)(object)itemOrb != (Object)null)
				{
					ItemOrbLocalPlayerAffectedField.SetValue(itemOrb, value);
				}
			}
			catch
			{
			}
		}
	}
}