Decompiled source of Scales of the Asclepius v1.0.3

ScalesAsclepius.dll

Decompiled 3 weeks ago
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
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 HG;
using HG.Reflection;
using Microsoft.CodeAnalysis;
using On.RoR2;
using R2API;
using R2API.Networking;
using R2API.Networking.Interfaces;
using RoR2;
using RoR2.ExpansionManagement;
using RoR2.Items;
using RoR2.Orbs;
using RoR2.UI;
using RoR2BepInExPack.GameAssetPathsBetter;
using ShaderSwapper;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: OptIn]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ScalesAsclepius")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+3ae453130dc65bba526ba0a993067cafa0ebae34")]
[assembly: AssemblyProduct("ScalesAsclepius")]
[assembly: AssemblyTitle("ScalesAsclepius")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace ScalesAsclepius
{
	public abstract class BuffBase : GenericBase<BuffDef>
	{
		protected virtual Color Color => Color.white;

		protected virtual Sprite IconSprite => null;

		protected virtual bool IsCooldown => false;

		protected virtual bool IsDebuff => false;

		protected virtual bool IsHidden => false;

		protected virtual bool IsStackable => false;

		protected override void Create()
		{
			//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)
			Value = ScriptableObject.CreateInstance<BuffDef>();
			((Object)Value).name = $"bd{Name}";
			Value.buffColor = Color;
			Value.iconSprite = IconSprite;
			Value.isCooldown = IsCooldown;
			Value.isDebuff = IsDebuff;
			Value.isHidden = IsHidden;
			Value.canStack = IsStackable;
			ContentAddition.AddBuffDef(Value);
		}
	}
	public abstract class GenericBase<T> where T : Object
	{
		protected T Value;

		protected abstract string Name { get; }

		public GenericBase()
		{
			if (IsEnabled())
			{
				Create();
				Initialize();
			}
		}

		protected virtual bool IsEnabled()
		{
			return true;
		}

		protected virtual void Create()
		{
		}

		protected virtual void Initialize()
		{
		}

		public T Get()
		{
			return Value;
		}
	}
	public abstract class ItemBase : GenericBase<ItemDef>
	{
		protected virtual bool IsConsumed => false;

		protected virtual bool IsRemovable => false;

		protected virtual bool IsHidden => false;

		protected virtual GameObject PickupModelPrefab => null;

		protected virtual Sprite PickupIconSprite => null;

		protected virtual ItemTag[] Tags => Array.Empty<ItemTag>();

		protected virtual CombinedItemTier Tier => (ItemTier)5;

		protected virtual string DisplayName => null;

		protected virtual string Description => null;

		protected virtual string PickupText => null;

		protected virtual string Lore => null;

		protected virtual ItemDisplayRuleDict ItemDisplay()
		{
			return null;
		}

		protected override void Create()
		{
			//IL_00a6: 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_01b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Expected O, but got Unknown
			Value = ScriptableObject.CreateInstance<ItemDef>();
			((Object)Value).name = Name;
			Value.isConsumed = IsConsumed;
			Value.canRemove = IsRemovable;
			Value.hidden = IsHidden;
			Value.pickupModelPrefab = PickupModelPrefab;
			Value.pickupIconSprite = PickupIconSprite;
			Value.tags = Tags;
			Value._itemTierDef = Tier;
			Value.deprecatedTier = Tier;
			if (Object.op_Implicit((Object)(object)Value))
			{
				Value.AutoPopulateTokens();
				if (!string.IsNullOrWhiteSpace(DisplayName))
				{
					Value.nameToken = SALanguage.LanguageAdd(Value.nameToken, DisplayName);
				}
				if (!string.IsNullOrWhiteSpace(Description))
				{
					Value.descriptionToken = SALanguage.LanguageAdd(Value.descriptionToken, Description);
				}
				if (!string.IsNullOrWhiteSpace(PickupText))
				{
					Value.pickupToken = SALanguage.LanguageAdd(Value.pickupToken, PickupText);
				}
				if (!string.IsNullOrWhiteSpace(Lore))
				{
					Value.loreToken = SALanguage.LanguageAdd(Value.loreToken, Lore);
				}
				LogDisplay();
			}
			ItemAPI.Add(new CustomItem(Value, ItemDisplay()));
		}

		protected virtual void LogDisplay()
		{
		}
	}
	public class FloatingPointFix : MonoBehaviour
	{
		private Transform transformComponent;

		private ModelPanelParameters modelComponent;

		public float sizeModifier;

		private void Awake()
		{
			transformComponent = ((Component)this).GetComponent<Transform>();
			modelComponent = ((Component)this).GetComponent<ModelPanelParameters>();
		}

		private void Start()
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)transformComponent) && Object.op_Implicit((Object)(object)modelComponent) && SceneCatalog.currentSceneDef.cachedName == "logbook")
			{
				Transform obj = transformComponent;
				obj.localScale *= sizeModifier;
				ModelPanelParameters obj2 = modelComponent;
				obj2.maxDistance *= sizeModifier;
				ModelPanelParameters obj3 = modelComponent;
				obj3.minDistance *= sizeModifier;
			}
		}
	}
	public struct CombinedItemTier
	{
		public ItemTierDef ItemTierDef;

		public ItemTier ItemTier;

		public static implicit operator ItemTierDef(CombinedItemTier self)
		{
			return self.ItemTierDef;
		}

		public static implicit operator ItemTier(CombinedItemTier self)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return self.ItemTier;
		}

		public static implicit operator CombinedItemTier(ItemTier itemTier)
		{
			//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)
			CombinedItemTier result = default(CombinedItemTier);
			result.ItemTier = itemTier;
			return result;
		}

		public static implicit operator CombinedItemTier(ItemTierDef itemTierDef)
		{
			CombinedItemTier result = default(CombinedItemTier);
			result.ItemTierDef = itemTierDef;
			return result;
		}
	}
	public static class PluginConfig
	{
		public enum MathProcess
		{
			Max,
			Min
		}

		public static ConfigEntry<bool> Enable_Logging;

		public static ConfigEntry<bool> Set_Default;

		public static ConfigEntry<int> Round_To;

		public static void Init()
		{
			GeneralInit();
		}

		private static void GeneralInit()
		{
			string text = "! General !";
			Enable_Logging = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<bool>(text, "Enable Logs", true, "[ True = Enables Logging | False = Disables Logging ]\nDisclaimer: Makes debugging harder when disabled");
			Set_Default = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<bool>(text, "Default Configs", true, "[ True = Sets item configs to default (Except Item Enabled) | False = Configs can be changed ]\nUseful for when Default Values get updated");
			Round_To = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<int>(text, "Item Stat Rounding", 0, "[ 0 = Whole | 1 = Tenths | 2 = Hundrenths | 3 = ... ]\nRounds item values to respective decimal point");
		}

		public static ConfigEntry<T> PostConfig<T>(this ConfigEntry<T> config)
		{
			if (Set_Default.Value)
			{
				((ConfigEntryBase)config).BoxedValue = ((ConfigEntryBase)config).DefaultValue;
			}
			return config;
		}

		public static ConfigEntry<float> PostConfig(this ConfigEntry<float> config, MathProcess capType, float capNum)
		{
			config = config.PostConfig<float>();
			if (capType == MathProcess.Max)
			{
				((ConfigEntryBase)config).BoxedValue = Mathf.Max((float)((ConfigEntryBase)config).BoxedValue, capNum);
			}
			else
			{
				((ConfigEntryBase)config).BoxedValue = Mathf.Min((float)((ConfigEntryBase)config).BoxedValue, capNum);
			}
			return config;
		}

		public static ConfigEntry<int> PostConfig(this ConfigEntry<int> config, MathProcess capType, int capNum)
		{
			config = config.PostConfig<int>();
			if (capType == MathProcess.Max)
			{
				((ConfigEntryBase)config).BoxedValue = Mathf.Max((int)((ConfigEntryBase)config).BoxedValue, capNum);
			}
			else
			{
				((ConfigEntryBase)config).BoxedValue = Mathf.Min((int)((ConfigEntryBase)config).BoxedValue, capNum);
			}
			return config;
		}
	}
	public class CompassFoundBuff : BuffBase
	{
		public static BuffDef BuffDef;

		protected override string Name => "CompassFoundBuff";

		protected override Sprite IconSprite => SotAPlugin.Bundle.LoadAsset<Sprite>("texCompassBuff");

		protected override Color Color => new Color(1f, 0f, 0f);

		protected override bool IsHidden => false;

		protected override void Initialize()
		{
			BuffDef = Value;
		}
	}
	public class HealFromDebuff : BuffBase
	{
		public static BuffDef BuffDef;

		protected override string Name => "HealFromDebuff";

		protected override Sprite IconSprite => Addressables.LoadAssetAsync<Sprite>((object)RoR2_Base_Medkit.texBuffMedkitHealIcon_tif).WaitForCompletion();

		protected override Color Color => new Color(1f, 0.922f, 0.886f);

		protected override bool IsStackable => false;

		protected override void Initialize()
		{
			BuffDef = Value;
		}
	}
	public class GauzePadItem : ItemBase
	{
		public static ConfigEntry<bool> Item_Enabled;

		public static ConfigEntry<float> Heal_Amount;

		public static ConfigEntry<float> Heal_Amount_Stack;

		public static ConfigEntry<float> Duration;

		public static ConfigEntry<float> Duration_Stack;

		public static float Level_Scale = 0.2f;

		public static ItemDef ItemDef;

		protected override string Name => "GauzePad";

		protected override CombinedItemTier Tier => (ItemTier)0;

		protected override ItemTag[] Tags => (ItemTag[])(object)new ItemTag[2]
		{
			(ItemTag)2,
			(ItemTag)31
		};

		protected override bool IsRemovable => true;

		protected override GameObject PickupModelPrefab => SotAPlugin.Bundle.LoadAsset<GameObject>("gauzePadModel");

		protected override Sprite PickupIconSprite => SotAPlugin.Bundle.LoadAsset<Sprite>("gauzeIconRender");

		protected override string DisplayName => "Gauze Pad";

		protected override string Description
		{
			get
			{
				List<string> list = new List<string>(2);
				list.Add(string.Format("Increase base health regeneration ".Style(SAColors.FontColor.cIsHealing) + "by " + "{0} hp/s ".Style(SAColors.FontColor.cIsHealing) + "({1} hp/s per stack) ".Style(SAColors.FontColor.cStack).OptText(Heal_Amount_Stack.Value != 0f), SAUtils.RoundVal(Heal_Amount.Value), SAUtils.RoundVal(Heal_Amount_Stack.Value).SignVal()));
				list.Add(string.Format("for " + "{0}s ".Style(SAColors.FontColor.cIsUtility) + "({1}s per stack) ".Style(SAColors.FontColor.cStack).OptText(Duration_Stack.Value != 0f) + "when gaining a " + "debuff".Style(SAColors.FontColor.cIsDamage) + ".", SAUtils.RoundVal(Duration.Value), SAUtils.RoundVal(Duration_Stack.Value).SignVal()));
				return SAUtils.FuseText(list);
			}
		}

		protected override string PickupText => "Rapidly heal when afflicted with a debuff.";

		protected override bool IsEnabled()
		{
			Heal_Amount = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Regeneration Amount", 6f, "[ 6 = +6 hp/s | Regeneration Amount ]").PostConfig(PluginConfig.MathProcess.Max, 0f);
			Heal_Amount_Stack = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Regeneration Amount Stack", 6f, "[ 6 = +6 hp/s | Regeneration Amount per Item Stack | 0 to Disable ]").PostConfig(PluginConfig.MathProcess.Max, 0f);
			Duration = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Effect Duration", 3f, "[ 3 = 3s | Duration for Regeneration ]").PostConfig(PluginConfig.MathProcess.Max, 0f);
			Duration_Stack = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Effect Duration Stack", 0f, "[ 1 = +1s | Duration for Regeneration per Item Stack | 0 to Disable ]").PostConfig(PluginConfig.MathProcess.Max, 0f);
			Item_Enabled = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<bool>(DisplayName + " - Item", "Enable Item", true, "[ True = Enabled | False = Disabled ]");
			return Item_Enabled.Value;
		}

		protected override void Initialize()
		{
			ItemDef = Value;
			ItemDef.requiredExpansion = SotAPlugin.ScalesAsclepiusExp;
		}

		protected override void LogDisplay()
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			ModelPanelParameters val = PickupModelPrefab.AddComponent<ModelPanelParameters>();
			Transform child = PickupModelPrefab.transform.GetChild(0);
			if (Object.op_Implicit((Object)(object)child))
			{
				val.focusPointTransform = child;
				val.cameraPositionTransform = child;
				val.minDistance = 1.25f;
				val.maxDistance = 6.25f;
				val.modelRotation = new Quaternion(0.01152916f, -0.5877523f, 0.045532152f, -0.80767643f);
			}
		}

		protected override ItemDisplayRuleDict ItemDisplay()
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			//IL_0037: 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_006f: 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_008a: 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_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: 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)
			PickupModelPrefab.AddComponent<ItemDisplay>().rendererInfos = SAREnderHelpers.ItemDisplaySetup(PickupModelPrefab);
			ItemDisplayRuleDict val = new ItemDisplayRuleDict(Array.Empty<ItemDisplayRule>());
			val.Add("CommandoBody", (ItemDisplayRule[])(object)new ItemDisplayRule[1]
			{
				new ItemDisplayRule
				{
					followerPrefab = PickupModelPrefab,
					ruleType = (ItemDisplayRuleType)0,
					childName = "Head",
					localPos = new Vector3(0.09018f, 0.33654f, 0.08826f),
					localAngles = new Vector3(359.2535f, 256.1467f, 31.56238f),
					localScale = new Vector3(0.25f, 0.25f, 0.25f)
				}
			});
			return val;
		}
	}
	public class CollectorsCompassItem : ItemBase
	{
		public static ConfigEntry<bool> Item_Enabled;

		public static ConfigEntry<int> InteractAmount;

		public static ConfigEntry<float> Health_Multiply;

		public static ConfigEntry<float> Health_Multiply_Stack;

		public static ConfigEntry<float> Speed_Multiply;

		public static ConfigEntry<float> Speed_Multiply_Stack;

		public static ItemDef ItemDef;

		protected override string Name => "CollectorsCompass";

		protected override CombinedItemTier Tier => (ItemTier)2;

		protected override ItemTag[] Tags
		{
			get
			{
				ItemTag[] array = new ItemTag[4];
				RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
				return (ItemTag[])(object)array;
			}
		}

		protected override bool IsRemovable => true;

		protected override GameObject PickupModelPrefab => SotAPlugin.Bundle.LoadAsset<GameObject>("collectorsCompassModel");

		protected override Sprite PickupIconSprite => SotAPlugin.Bundle.LoadAsset<Sprite>("collectorsCompassRender");

		private static string ConfigName => "Collectors Compass";

		protected override string DisplayName => "Collector's Compass";

		protected override string Description
		{
			get
			{
				List<string> list = new List<string>(5);
				list.Add("At the " + "start of each stage".Style(SAColors.FontColor.cIsUtility) + ", " + "mark ".Style(SAColors.FontColor.cIsHealth) + "a random interactable. ");
				list.Add("Using a " + "marked ".Style(SAColors.FontColor.cIsHealth) + "interactable " + "marks ".Style(SAColors.FontColor.cIsHealth) + "another. ");
				list.Add(string.Format("Claiming " + "{0} marks ".Style(SAColors.FontColor.cIsHealth) + "reveals".Style(SAColors.FontColor.cIsUtility) + " all remaining interactables ", InteractAmount.Value));
				list.Add(string.Format("and increases all allies " + "maximum health ".Style(SAColors.FontColor.cIsHealing) + "by " + "{0}% ".Style(SAColors.FontColor.cIsHealing) + "({1}% per stack) ".OptText(Health_Multiply_Stack.Value != 0f).Style(SAColors.FontColor.cStack), SAUtils.RoundVal(Health_Multiply.Value), SAUtils.RoundVal(Health_Multiply_Stack.Value).SignVal()));
				list.Add(string.Format("and " + "movement speed ".Style(SAColors.FontColor.cIsUtility) + "by " + "{0}%".Style(SAColors.FontColor.cIsUtility) + " ({1}% per stack)".OptText(Speed_Multiply_Stack.Value != 0f).Style(SAColors.FontColor.cStack) + ".", SAUtils.RoundVal(Speed_Multiply.Value), SAUtils.RoundVal(Speed_Multiply_Stack.Value).SignVal()));
				return SAUtils.FuseText(list);
			}
		}

		protected override string PickupText => $"Marks interactables, revealing all interactables and increases maximum health and speed after claiming {InteractAmount.Value}.";

		protected override bool IsEnabled()
		{
			InteractAmount = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<int>(ConfigName + " - Item", "Interact Amount", 3, "[ 3 = 3 | Interactables Found to Proc Item ]").PostConfig(PluginConfig.MathProcess.Max, 1);
			Health_Multiply = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(ConfigName + " - Item", "Health Multiply", 100f, "[ 100 = 100% | Max Health Increase on Buff ]").PostConfig(PluginConfig.MathProcess.Max, 0f);
			Health_Multiply_Stack = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(ConfigName + " - Item", "Health Multiply Stack", 50f, "[ 50 = +50% | Max Health Increase on Buff per Item Stack ]").PostConfig(PluginConfig.MathProcess.Max, 0f);
			Speed_Multiply = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(ConfigName + " - Item", "Speed Multiply", 15f, "[ 15 = 15% | Speed Increase on Buff ]").PostConfig(PluginConfig.MathProcess.Max, 0f);
			Speed_Multiply_Stack = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(ConfigName + " - Item", "Speed Multiply Stack", 0f, "[ 15 = +15% | Speed Increase on Buff per Item Stack ]").PostConfig(PluginConfig.MathProcess.Max, 0f);
			Item_Enabled = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<bool>(ConfigName + " - Item", "Enable Item", true, "[ True = Enabled | False = Disabled ]");
			return Item_Enabled.Value;
		}

		protected override void Initialize()
		{
			//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)
			ItemDef = Value;
			ItemDef.requiredExpansion = SotAPlugin.ScalesAsclepiusExp;
			MeshRenderer component = ((Component)ItemDef.pickupModelPrefab.transform.Find("mdlCompass")).GetComponent<MeshRenderer>();
			Texture val = Addressables.LoadAssetAsync<Texture>((object)RoR2_Base_Common_ColorRamps.texRampBandit_png).WaitForCompletion();
			((Renderer)component).sharedMaterial.SetTexture("_FresnelRamp", val);
		}

		protected override void LogDisplay()
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			ModelPanelParameters val = PickupModelPrefab.AddComponent<ModelPanelParameters>();
			Transform child = PickupModelPrefab.transform.GetChild(0);
			if (Object.op_Implicit((Object)(object)child))
			{
				val.focusPointTransform = child;
				val.cameraPositionTransform = child;
				val.minDistance = 1.25f;
				val.maxDistance = 6.25f;
				val.modelRotation = new Quaternion(0.01152916f, -0.5877523f, 0.045532152f, -0.80767643f);
			}
		}
	}
	public class IVBagItem : ItemBase
	{
		public static ConfigEntry<bool> Item_Enabled;

		public static ConfigEntry<int> Target_Count;

		public static ConfigEntry<int> Target_Count_Stack;

		public static ConfigEntry<float> Heal_Percent;

		public static ConfigEntry<float> Heal_Percent_Stack;

		public static ConfigEntry<float> Radius;

		public static ConfigEntry<float> Radius_Stack;

		public static ItemDef ItemDef;

		protected override string Name => "IVBag";

		protected override CombinedItemTier Tier => (ItemTier)1;

		protected override ItemTag[] Tags
		{
			get
			{
				ItemTag[] array = new ItemTag[3];
				RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
				return (ItemTag[])(object)array;
			}
		}

		protected override bool IsRemovable => true;

		protected override GameObject PickupModelPrefab => SotAPlugin.Bundle.LoadAsset<GameObject>("IVBagModel");

		protected override Sprite PickupIconSprite => SotAPlugin.Bundle.LoadAsset<Sprite>("IVBagRender");

		protected override string DisplayName => "IV Bag";

		protected override string Description
		{
			get
			{
				List<string> list = new List<string>(3);
				list.Add(string.Format("Tether ".Style(SAColors.FontColor.cIsHealing) + "to the nearest {0} " + "({1} per stack) ".Style(SAColors.FontColor.cStack).OptText(Target_Count_Stack.Value != 0) + "allies ".OptText("ally ", Target_Count_Stack.Value != 0 || Target_Count.Value > 1), Target_Count.Value, Target_Count_Stack.Value.SignVal()));
				list.Add(string.Format("within " + "{0}m".Style(SAColors.FontColor.cIsUtility) + " ({1}m per stack)".Style(SAColors.FontColor.cStack).OptText(Radius_Stack.Value != 0f) + ", ", SAUtils.RoundVal(Radius.Value), SAUtils.RoundVal(Radius_Stack.Value).SignVal()));
				list.Add(string.Format("sharing " + "{0}% ".Style(SAColors.FontColor.cIsHealing) + "({1}% per stack) ".Style(SAColors.FontColor.cStack).OptText(Heal_Percent_Stack.Value != 0f) + "of " + "all healing".Style(SAColors.FontColor.cIsHealing) + ".", SAUtils.RoundVal(Heal_Percent.Value), SAUtils.RoundVal(Heal_Percent_Stack.Value).SignVal()));
				return SAUtils.FuseText(list);
			}
		}

		protected override string PickupText => "Tether to " + "a nearby ally".OptText("nearby allies", Target_Count.Value > 1) + ", sharing all healing.";

		protected override bool IsEnabled()
		{
			Target_Count = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<int>(DisplayName + " - Item", "Tether Count", 1, "[ 1 = 1 | Max Tether to Ally ]");
			Target_Count_Stack = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<int>(DisplayName + " - Item", "Tether Count Stack", 1, "[ 1 = +1 | Max Tether to Ally per Item Stack | 0 to Disable ]");
			Heal_Percent = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Healing Shared", 50f, "[ 50 = 50% | Healing Shared to Tethered Ally ]");
			Heal_Percent_Stack = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Healing Shared Stack", 0f, "[ 50 = +50% | Healing Shared per Item Stack | 0 to Disable ]");
			Radius = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Radius", 30f, "[ 30 = 30 | Meter Radius ]");
			Radius_Stack = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Radius Stack", 0f, "[ 10 = +10 | Meter Radius per Item Stack | 0 to Disable ]");
			Item_Enabled = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<bool>(DisplayName + " - Item", "Enable Item", true, "[ True = Enabled | False = Disabled ]");
			Target_Count.Value = Mathf.Max(Target_Count.Value, 0);
			Target_Count_Stack.Value = Mathf.Max(Target_Count_Stack.Value, 0);
			Heal_Percent.Value = Mathf.Max(Heal_Percent.Value, 0f);
			Heal_Percent_Stack.Value = Mathf.Max(Heal_Percent_Stack.Value, 0f);
			Radius.Value = Mathf.Max(Radius.Value, 0f);
			Radius_Stack.Value = Mathf.Max(Radius_Stack.Value, 0f);
			return Item_Enabled.Value;
		}

		protected override void Initialize()
		{
			ItemDef = Value;
			ItemDef.requiredExpansion = SotAPlugin.ScalesAsclepiusExp;
		}

		protected override void LogDisplay()
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			ModelPanelParameters val = PickupModelPrefab.AddComponent<ModelPanelParameters>();
			Transform child = PickupModelPrefab.transform.GetChild(0);
			if (Object.op_Implicit((Object)(object)child))
			{
				val.focusPointTransform = child;
				val.cameraPositionTransform = child;
				val.minDistance = 1.25f;
				val.maxDistance = 6.25f;
				val.modelRotation = new Quaternion(0.01152916f, -0.5877523f, 0.045532152f, -0.80767643f);
				FloatingPointFix floatingPointFix = PickupModelPrefab.AddComponent<FloatingPointFix>();
				floatingPointFix.sizeModifier = 1f;
			}
		}
	}
	public class PottingSoilItem : ItemBase
	{
		public static ConfigEntry<bool> Item_Enabled;

		public static ItemDef ItemDef;

		protected override string Name => "PottingSoil";

		protected override CombinedItemTier Tier => (ItemTier)1;

		protected override ItemTag[] Tags
		{
			get
			{
				ItemTag[] array = new ItemTag[3];
				RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
				return (ItemTag[])(object)array;
			}
		}

		protected override bool IsRemovable => true;

		protected override string DisplayName => "Potting Soil";

		protected override bool IsEnabled()
		{
			Item_Enabled = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<bool>(DisplayName + " - Item", "Enable Item", false, "[ True = Enabled | False = Disabled ]");
			return Item_Enabled.Value;
		}

		protected override void Initialize()
		{
			ItemDef = Value;
			ItemDef.requiredExpansion = SotAPlugin.ScalesAsclepiusExp;
		}
	}
	public class BubbleWrapItem : ItemBase
	{
		public static ConfigEntry<bool> Item_Enabled;

		public static ConfigEntry<float> Heal_Percent;

		public static ConfigEntry<float> Heal_Percent_Stack;

		public static ConfigEntry<float> Debuff_Reduce;

		public static ConfigEntry<float> Debuff_Reduce_Stack;

		private static readonly string VoidCorruptText = "Corrupts all Gauze Pads".Style(SAColors.FontColor.cIsVoid) + ".";

		public static ItemDef ItemDef;

		protected override string Name => "BubbleWrap";

		protected override CombinedItemTier Tier => (ItemTier)6;

		protected override ItemTag[] Tags => (ItemTag[])(object)new ItemTag[2]
		{
			(ItemTag)2,
			(ItemTag)31
		};

		protected override GameObject PickupModelPrefab => SotAPlugin.Bundle.LoadAsset<GameObject>("bubbleWrapModel");

		protected override Sprite PickupIconSprite => SotAPlugin.Bundle.LoadAsset<Sprite>("bubbleIconRender");

		protected override string DisplayName => "Bubble Wrap";

		protected override string Description
		{
			get
			{
				List<string> list = new List<string>(3);
				list.Add(string.Format("Reduce all " + "debuff ".Style(SAColors.FontColor.cIsDamage) + "durations by " + "{0} ".Style(SAColors.FontColor.cIsUtility) + "({1} per stack) ".Style(SAColors.FontColor.cStack).OptText(Debuff_Reduce_Stack.Value != 0f) + "second" + "s".OptText(Debuff_Reduce_Stack.Value != 0f || Debuff_Reduce.Value > 1f) + ". ", SAUtils.RoundVal(Debuff_Reduce.Value), SAUtils.RoundVal(Debuff_Reduce_Stack.Value).SignVal()));
				list.Add(string.Format("Heal ".Style(SAColors.FontColor.cIsHealing) + "for " + "{0}% ".Style(SAColors.FontColor.cIsHealing) + "({1}% per stack) ".Style(SAColors.FontColor.cStack).OptText(Heal_Percent_Stack.Value != 0f) + "of " + "maximum health ".Style(SAColors.FontColor.cIsHealing) + "after a " + "debuff ".Style(SAColors.FontColor.cIsDamage) + "ends. ", SAUtils.RoundVal(Heal_Percent.Value), SAUtils.RoundVal(Heal_Percent_Stack.Value).SignVal()));
				list.Add(VoidCorruptText);
				return SAUtils.FuseText(list);
			}
		}

		protected override string PickupText => string.Format("Reduce debuff durations by {0} second" + "s".OptText(Debuff_Reduce.Value > 1f) + ". Heal after removing a debuff. " + VoidCorruptText, SAUtils.RoundVal(Debuff_Reduce.Value));

		protected override bool IsEnabled()
		{
			Heal_Percent = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Percent Heal", 5f, "[ 5 = 5% | of Maximum Health Healing ]");
			Heal_Percent_Stack = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Percent Heal Stack", 2.5f, "[ 2.5 = +2.5% | of Maximum Health Healing per Item Stack | 0 to Disable ]");
			Debuff_Reduce = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Debuff Reduce", 1f, "[ 1 = 1s | Debuff Duration Reduced ]");
			Debuff_Reduce_Stack = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Debuff Reduce Stack", 0f, "[ 1 = +1s | Debuff Duration Reduced per Item Stack | 0 to Disable ]");
			Item_Enabled = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<bool>(DisplayName + " - Item", "Enable Item", true, "[ True = Enabled | False = Disabled ]");
			Heal_Percent.Value = Mathf.Max(Heal_Percent.Value, 0f);
			Heal_Percent_Stack.Value = Mathf.Max(Heal_Percent_Stack.Value, 0f);
			Debuff_Reduce.Value = Mathf.Max(Debuff_Reduce.Value, 0f);
			Debuff_Reduce_Stack.Value = Mathf.Max(Debuff_Reduce_Stack.Value, 0f);
			return Item_Enabled.Value;
		}

		protected override void Initialize()
		{
			ItemDef = Value;
			ItemDef.requiredExpansion = SotAPlugin.ScalesAsclepiusExp;
		}

		protected override void LogDisplay()
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			ModelPanelParameters val = PickupModelPrefab.AddComponent<ModelPanelParameters>();
			Transform child = PickupModelPrefab.transform.GetChild(0);
			if (Object.op_Implicit((Object)(object)child))
			{
				val.focusPointTransform = child;
				val.cameraPositionTransform = child;
				val.minDistance = 1.25f;
				val.maxDistance = 6.25f;
				val.modelRotation = new Quaternion(0.01152916f, -0.5877523f, 0.045532152f, -0.80767643f);
				FloatingPointFix floatingPointFix = PickupModelPrefab.AddComponent<FloatingPointFix>();
				floatingPointFix.sizeModifier = 1f;
			}
		}
	}
	public class JellyBagItem : ItemBase
	{
		public static ConfigEntry<bool> Item_Enabled;

		public static ConfigEntry<float> Heal_Percent;

		public static ConfigEntry<float> Heal_Percent_Stack;

		public static ConfigEntry<float> Threshold;

		public static ConfigEntry<float> Threshold_Stack;

		public static ConfigEntry<float> Radius;

		public static ConfigEntry<float> Radius_Stack;

		private static readonly string VoidCorruptText = "Corrupts all IV Bags".Style(SAColors.FontColor.cIsVoid) + ".";

		public static ItemDef ItemDef;

		protected override string Name => "JellyBag";

		protected override CombinedItemTier Tier => (ItemTier)7;

		protected override ItemTag[] Tags
		{
			get
			{
				ItemTag[] array = new ItemTag[3];
				RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
				return (ItemTag[])(object)array;
			}
		}

		protected override GameObject PickupModelPrefab => SotAPlugin.Bundle.LoadAsset<GameObject>("jellyBagModel");

		protected override Sprite PickupIconSprite => SotAPlugin.Bundle.LoadAsset<Sprite>("jellyBagRender");

		protected override string DisplayName => "Jelly Bag";

		protected override string Description
		{
			get
			{
				List<string> list = new List<string>(4);
				list.Add(string.Format("Heal ".Style(SAColors.FontColor.cIsHealing) + "for " + "{0}% ".Style(SAColors.FontColor.cIsHealing) + "({1} per stack) ".Style(SAColors.FontColor.cStack).OptText(Heal_Percent_Stack.Value != 0f) + "of damage when nearby allies ", SAUtils.RoundVal(Heal_Percent.Value), SAUtils.RoundVal(Heal_Percent_Stack.Value).SignVal()));
				list.Add(string.Format("within " + "{0}m ".Style(SAColors.FontColor.cIsUtility) + "({1}m per stack) ".Style(SAColors.FontColor.cStack).OptText(Radius_Stack.Value != 0f) + "take damage for ", SAUtils.RoundVal(Radius.Value), SAUtils.RoundVal(Radius_Stack.Value).SignVal()));
				list.Add(string.Format("at least " + "{0}% ".Style(SAColors.FontColor.cIsHealth) + "({1}% per stack) ".Style(SAColors.FontColor.cStack).OptText(Threshold_Stack.Value != 0f) + "health".Style(SAColors.FontColor.cIsHealth) + ". ", SAUtils.RoundVal(Threshold.Value), SAUtils.RoundVal(Threshold_Stack.Value).SignVal()));
				list.Add(VoidCorruptText);
				return SAUtils.FuseText(list);
			}
		}

		protected override string PickupText => "Heal when nearby allies take damage. " + VoidCorruptText;

		protected override bool IsEnabled()
		{
			Heal_Percent = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Percent Heal", 50f, "[ 50 = 50% | Damage to Healing ]");
			Heal_Percent_Stack = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Percent Heal Stack", 0f, "[ 25 = +25% | Damage to Healing per Item Stack | 0 to Disable ]");
			Threshold = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Damage Threshold", 25f, "[ 25 = 25% | Damaged Required to Proc ]");
			Threshold_Stack = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Damage Threshold Stack", -50f, "[ -50 = -50% | Damaged Required to Proc per Item Stack | RECIPROCAL | 0 to Disable ]");
			Radius = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Radius", 30f, "[ 30 = 30 | Meter Radius ]");
			Radius_Stack = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<float>(DisplayName + " - Item", "Radius Stack", 0f, "[ 5 = +5 | Meter Radius per Item Stack | 0 to Disable ]");
			Heal_Percent.Value = Mathf.Max(Heal_Percent.Value, 0f);
			Heal_Percent_Stack.Value = Mathf.Max(Heal_Percent_Stack.Value, 0f);
			Threshold.Value = Mathf.Max(Threshold.Value, 0f);
			Threshold_Stack.Value = Mathf.Min(Threshold_Stack.Value, 0f);
			Radius.Value = Mathf.Max(Radius.Value, 0f);
			Radius_Stack.Value = Mathf.Max(Radius_Stack.Value, 0f);
			Item_Enabled = ((BaseUnityPlugin)SotAPlugin.Instance).Config.Bind<bool>(DisplayName + " - Item", "Enable Item", true, "[ True = Enabled | False = Disabled ]");
			return Item_Enabled.Value;
		}

		protected override void Initialize()
		{
			ItemDef = Value;
			ItemDef.requiredExpansion = SotAPlugin.ScalesAsclepiusExp;
			GameObject val = SotAPlugin.Bundle.LoadAsset<GameObject>("jellyBagDisplay");
			DynamicBone val2 = val.AddComponent<DynamicBone>();
			val2.m_Root = val.transform.root;
		}

		protected override void LogDisplay()
		{
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			ModelPanelParameters val = PickupModelPrefab.AddComponent<ModelPanelParameters>();
			Transform val2 = PickupModelPrefab.transform.Find("mdlJellyBag");
			if (Object.op_Implicit((Object)(object)val2))
			{
				val.focusPointTransform = val2;
				val.cameraPositionTransform = val2;
				val.minDistance = 1f;
				val.maxDistance = 6.25f;
				val.modelRotation = new Quaternion(0.01152916f, -0.5877523f, 0.045532152f, -0.80767643f);
			}
		}
	}
	public class BubbleWrapHooks
	{
		public static bool ItemEnabled;

		private static EffectDef BounceEffect;

		public BubbleWrapHooks()
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Expected O, but got Unknown
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Expected O, but got Unknown
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Expected O, but got Unknown
			ItemEnabled = BubbleWrapItem.Item_Enabled.Value;
			if (ItemEnabled && GauzePadItem.Item_Enabled.Value)
			{
				CreateBubbleEffect();
				CharacterBody.OnBuffFinalStackLost += new hook_OnBuffFinalStackLost(CharacterBody_OnBuffFinalStackLost);
				DotController.OnDotStackRemovedServer += new hook_OnDotStackRemovedServer(DotController_OnDotStackRemovedServer);
				CharacterBody.AddTimedBuff_BuffDef_float += new hook_AddTimedBuff_BuffDef_float(CharacterBody_AddTimedBuff_BuffDef_float);
			}
		}

		private static void CreateBubbleEffect()
		{
			//IL_0006: 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_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Expected O, but got Unknown
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Expected O, but got Unknown
			GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAsset<GameObject>((object)RoR2_DLC1_BearVoid.BearVoidProc_prefab).WaitForCompletion(), "BubbleWrapProc");
			EffectComponent component = val.GetComponent<EffectComponent>();
			GameObject gameObject = ((Component)val.transform.Find("TextCamScaler")).gameObject;
			component.soundName = "";
			Object.Destroy((Object)(object)gameObject);
			foreach (Transform componentInChild in val.GetComponentInChildren<Transform>())
			{
				Transform val2 = componentInChild;
				val2.localScale *= 0.5f;
			}
			BounceEffect = new EffectDef
			{
				prefab = val,
				prefabName = "BubbleWrapProc",
				prefabEffectComponent = component
			};
			ContentAddition.AddEffect(BounceEffect.prefab);
		}

		private void AddHealFromDebuff(CharacterBody self)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Expected O, but got Unknown
			int num = (Object.op_Implicit((Object)(object)((self != null) ? self.inventory : null)) ? self.inventory.GetItemCount(BubbleWrapItem.ItemDef) : 0);
			if (num > 0)
			{
				ProcChainMask val = default(ProcChainMask);
				float num2 = BubbleWrapItem.Heal_Percent.Value;
				if (BubbleWrapItem.Heal_Percent_Stack.Value > 0f)
				{
					float num3 = BubbleWrapItem.Heal_Percent_Stack.Value * (float)(num - 1);
					num2 += num3;
				}
				((Component)self).GetComponent<HealthComponent>().HealFraction(num2 / 100f, val);
				Util.PlaySound("Play_gup_step", ((Component)self).gameObject);
				EffectManager.SpawnEffect(BounceEffect.prefab, new EffectData
				{
					rootObject = ((Component)self).gameObject,
					rotation = Quaternion.identity
				}, true);
			}
		}

		private void DotController_OnDotStackRemovedServer(orig_OnDotStackRemovedServer orig, DotController self, DotStack dotStack)
		{
			DotDef dotDef = dotStack.dotDef;
			CharacterBody victimBody = self.victimBody;
			int buffCount = victimBody.GetBuffCount(dotDef.associatedBuff);
			if (Object.op_Implicit((Object)(object)((victimBody != null) ? victimBody.inventory : null)) && buffCount <= 1)
			{
				AddHealFromDebuff(self.victimBody);
			}
			orig.Invoke(self, dotStack);
		}

		private void CharacterBody_OnBuffFinalStackLost(orig_OnBuffFinalStackLost orig, CharacterBody self, BuffDef buffDef)
		{
			orig.Invoke(self, buffDef);
			if (Object.op_Implicit((Object)(object)((self != null) ? self.inventory : null)) && Object.op_Implicit((Object)(object)buffDef) && (buffDef.isDebuff || buffDef.isCooldown) && !buffDef.isDOT)
			{
				AddHealFromDebuff(self);
			}
		}

		private void CharacterBody_AddTimedBuff_BuffDef_float(orig_AddTimedBuff_BuffDef_float orig, CharacterBody self, BuffDef buffDef, float duration)
		{
			if (Object.op_Implicit((Object)(object)((self != null) ? self.inventory : null)))
			{
				int itemCount = self.inventory.GetItemCount(BubbleWrapItem.ItemDef);
				bool flag = buffDef.isDebuff || buffDef.isDOT || buffDef.isCooldown;
				float num = BubbleWrapItem.Debuff_Reduce.Value;
				if (itemCount > 0 && flag)
				{
					if (BubbleWrapItem.Debuff_Reduce_Stack.Value > 0f)
					{
						float num2 = BubbleWrapItem.Debuff_Reduce_Stack.Value * (float)(itemCount - 1);
						num += num2;
					}
					duration = Math.Max(0f, duration - num);
				}
			}
			orig.Invoke(self, buffDef, duration);
		}
	}
	public class CollectorsCompassHooks
	{
		public class CompassList : MonoBehaviour
		{
			public bool IsMarked;

			public GameObject PosIndicator;

			public GameObject MarkEffect;

			public static List<CompassList> AllInteractables = new List<CompassList>();

			public void Awake()
			{
				AllInteractables.Add(this);
			}

			public void OnDisable()
			{
				RemoveFromList();
			}

			public void OnDestroy()
			{
				RemoveFromList();
			}

			public void RemoveFromList()
			{
				AllInteractables.Remove(this);
			}
		}

		public class PermanentReveal : NetworkBehaviour
		{
			private PositionIndicator PosIndicator;

			private PurchaseInteraction PurchaseInteract;

			private BarrelInteraction BarrelInteract;

			public static void ShowObject(GameObject gameObject)
			{
				if (!Object.op_Implicit((Object)(object)gameObject.GetComponent<PermanentReveal>()))
				{
					gameObject.AddComponent<PermanentReveal>();
				}
			}

			public void OnEnable()
			{
				//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)
				if (!Object.op_Implicit((Object)(object)((Component)this).gameObject))
				{
					return;
				}
				NetworkIdentity component = ((Component)this).gameObject.GetComponent<NetworkIdentity>();
				if (Object.op_Implicit((Object)(object)component))
				{
					foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
					{
						if ((Object)(object)instance != (Object)null && instance.isPingTheSameNetworkObject(component))
						{
							Object.Destroy((Object)(object)this);
							return;
						}
					}
				}
				GameObject val = Object.Instantiate<GameObject>(RoR2Indicator, ((Component)this).transform.position, Quaternion.identity);
				PosIndicator = val.GetComponent<PositionIndicator>();
				PosIndicator.insideViewObject.GetComponent<SpriteRenderer>().sprite = PingIndicator.GetInteractableIcon(((Component)this).gameObject);
				PosIndicator.targetTransform = ((Component)this).transform;
				PurchaseInteract = ((Component)this).gameObject.GetComponent<PurchaseInteraction>();
				BarrelInteract = ((Component)this).gameObject.GetComponent<BarrelInteraction>();
			}

			public void OnDisable()
			{
				if (Object.op_Implicit((Object)(object)PosIndicator))
				{
					Object.Destroy((Object)(object)((Component)PosIndicator).gameObject);
					PosIndicator = null;
				}
			}

			public void FixedUpdate()
			{
				bool flag = false;
				if (Object.op_Implicit((Object)(object)PurchaseInteract) && !PurchaseInteract.available)
				{
					flag = true;
				}
				if (Object.op_Implicit((Object)(object)BarrelInteract) && BarrelInteract.opened)
				{
					flag = true;
				}
				if (flag)
				{
					OnDisable();
				}
				else if (!flag && !Object.op_Implicit((Object)(object)PosIndicator))
				{
					OnEnable();
				}
			}
		}

		public static bool ItemEnabled;

		public static GameObject HealthPopUp;

		public static GameObject ArrowPrefab;

		public static GameObject RoR2Indicator;

		public static int ActivateCount;

		public CollectorsCompassHooks()
		{
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Expected O, but got Unknown
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Expected O, but got Unknown
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Expected O, but got Unknown
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Expected O, but got Unknown
			ItemEnabled = CollectorsCompassItem.Item_Enabled.Value;
			if (ItemEnabled)
			{
				ActivateCount = 0;
				CreateIcon();
				CreateArrows();
				SetUpBarrel();
				RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
				SceneDirector.onPostPopulateSceneServer += SceneDirector_onPostPopulateSceneServer;
				PurchaseInteraction.Awake += new hook_Awake(PurchaseInteraction_Awake);
				PurchaseInteraction.OnInteractionBegin += new hook_OnInteractionBegin(PurchaseInteraction_OnInteractionBegin);
				BarrelInteraction.OnInteractionBegin += new hook_OnInteractionBegin(BarrelInteraction_OnInteractionBegin);
			}
		}

		private void CreateIcon()
		{
			//IL_0006: 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_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Expected O, but got Unknown
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = PrefabAPI.InstantiateClone(((Component)Addressables.LoadAssetAsync<GameObject>((object)RoR2_Base_ShrineChance.ShrineChance_prefab).WaitForCompletion().transform.Find("Symbol")).gameObject, "CollectorsCompassMark");
			Texture val2 = Addressables.LoadAssetAsync<Texture>((object)RoR2_Base_Common.texCloudWaterFoam2_psd).WaitForCompletion();
			MeshRenderer component = val.GetComponent<MeshRenderer>();
			Material val3 = new Material(((Renderer)component).sharedMaterial);
			val.AddComponent<NetworkIdentity>();
			val.transform.localScale = Vector3.one * 12f;
			val3.mainTexture = (Texture)(object)SotAPlugin.Bundle.LoadAsset<Sprite>("compassMarkIcon").texture;
			val3.SetTexture("_Cloud1Tex", val2);
			val3.SetColor("_TintColor", new Color(1f, 0f, 0f, 0.745f));
			val3.SetFloat("_AlphaBoost", 0.35f);
			val3.SetFloat("_AlphaBias", 0.4f);
			val3.SetFloat("_DistortionStrength", 0.05f);
			((Renderer)component).sharedMaterial = val3;
			HealthPopUp = val;
		}

		private void CreateArrows()
		{
			//IL_0006: 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_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			GameObject arrowPrefab = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)RoR2_Base_Common.BossPositionIndicator_prefab).WaitForCompletion(), "CompassPositionIndicator");
			GameObject roR2Indicator = Addressables.LoadAssetAsync<GameObject>((object)RoR2_Base_Common.PoiPositionIndicator_prefab).WaitForCompletion();
			ArrowPrefab = arrowPrefab;
			RoR2Indicator = roR2Indicator;
		}

		private void SetUpBarrel()
		{
			//IL_0006: 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)
			GameObject val = Addressables.LoadAssetAsync<GameObject>((object)RoR2_Base_Barrel1.Barrel1_prefab).WaitForCompletion();
			val.AddComponent<CompassList>();
		}

		private GameObject MarkInteract()
		{
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
			if (SceneInfo.instance.countsAsStage)
			{
				CompassList compassList = null;
				int num = 0;
				while (!Object.op_Implicit((Object)(object)compassList) && (double)num < Math.Pow(CompassList.AllInteractables.Count, 2.0))
				{
					int count = CompassList.AllInteractables.Count;
					int index = Random.RandomRange(0, count - 1);
					CompassList compassList2 = CompassList.AllInteractables[index];
					if (Object.op_Implicit((Object)(object)compassList2))
					{
						PurchaseInteraction component = ((Component)compassList2).gameObject.GetComponent<PurchaseInteraction>();
						BarrelInteraction component2 = ((Component)compassList2).gameObject.GetComponent<BarrelInteraction>();
						if (Object.op_Implicit((Object)(object)component) && component.available)
						{
							compassList = compassList2;
						}
						else if (Object.op_Implicit((Object)(object)component2) && !component2.opened)
						{
							compassList = compassList2;
						}
						else
						{
							compassList2.RemoveFromList();
						}
					}
					num++;
				}
				if (Object.op_Implicit((Object)(object)compassList))
				{
					GameObject gameObject = ((Component)compassList).gameObject;
					GameObject val = Object.Instantiate<GameObject>(HealthPopUp, gameObject.transform.position, Quaternion.identity);
					Highlight component3 = ((Component)compassList).gameObject.GetComponent<Highlight>();
					Transform transform = val.transform;
					transform.position += new Vector3(0f, 4f, 0f);
					component3.highlightColor = (HighlightColor)3;
					component3.CustomColor = new Color(1f, 0f, 0f);
					if (Object.op_Implicit((Object)(object)gameObject.GetComponent<ShopTerminalBehavior>()?.serverMultiShopController))
					{
						MultiShopController serverMultiShopController = gameObject.GetComponent<ShopTerminalBehavior>().serverMultiShopController;
						GameObject[] terminalGameObjects = serverMultiShopController.terminalGameObjects;
						foreach (GameObject val2 in terminalGameObjects)
						{
							val2.GetComponent<Highlight>().highlightColor = (HighlightColor)3;
							val2.GetComponent<Highlight>().CustomColor = new Color(1f, 0f, 0f);
						}
					}
					compassList.MarkEffect = val;
					compassList.IsMarked = true;
					return gameObject;
				}
			}
			return null;
		}

		private void ReplaceMark(CompassList component, GameObject interactable)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			ActivateCount++;
			Util.PlaySound("Play_env_hiddenLab_laptop_sequence_lock", interactable);
			component.IsMarked = false;
			interactable.GetComponent<Highlight>().highlightColor = (HighlightColor)0;
			interactable.GetComponent<Highlight>().isOn = false;
			Object.Destroy((Object)(object)component.MarkEffect);
			Object.Destroy((Object)(object)component.PosIndicator);
			if (ActivateCount >= CollectorsCompassItem.InteractAmount.Value)
			{
				ReadOnlyCollection<TeamComponent> teamMembers = TeamComponent.GetTeamMembers((TeamIndex)1);
				List<CharacterBody> list = new List<CharacterBody>();
				foreach (TeamComponent item in teamMembers)
				{
					CharacterBody body = item.body;
					PlayerCharacterMasterController val = (Object.op_Implicit((Object)(object)body.master) ? body.master.playerCharacterMasterController : null);
					if (Object.op_Implicit((Object)(object)val))
					{
						list.Add(body);
					}
				}
				foreach (CharacterBody item2 in list)
				{
					if (Object.op_Implicit((Object)(object)item2))
					{
						item2.AddBuff(CompassFoundBuff.BuffDef);
					}
				}
				foreach (CompassList allInteractable in CompassList.AllInteractables)
				{
					GameObject val2 = (Object.op_Implicit((Object)(object)allInteractable) ? ((Component)allInteractable).gameObject : null);
					if (Object.op_Implicit((Object)(object)val2))
					{
						val2.AddComponent<PermanentReveal>();
					}
				}
				Util.PlaySound("Play_UI_rustedLockbox_open", interactable);
			}
			else
			{
				GameObject val3 = MarkInteract();
				if (Object.op_Implicit((Object)(object)val3))
				{
					GameObject val4 = Object.Instantiate<GameObject>(ArrowPrefab, val3.transform);
					val4.GetComponent<PositionIndicator>().targetTransform = val3.transform;
					val3.GetComponent<CompassList>().PosIndicator = val4;
				}
			}
		}

		private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			if (sender.HasBuff(CompassFoundBuff.BuffDef))
			{
				int itemCountForTeam = Util.GetItemCountForTeam(sender.teamComponent.teamIndex, CollectorsCompassItem.ItemDef.itemIndex, false, true);
				float num = CollectorsCompassItem.Health_Multiply.Value;
				float num2 = CollectorsCompassItem.Speed_Multiply.Value;
				if (CollectorsCompassItem.Health_Multiply_Stack.Value > 0f)
				{
					float num3 = CollectorsCompassItem.Health_Multiply_Stack.Value * (float)(itemCountForTeam - 1);
					num += num3;
				}
				if (CollectorsCompassItem.Speed_Multiply_Stack.Value > 0f)
				{
					float num4 = CollectorsCompassItem.Speed_Multiply_Stack.Value * (float)(itemCountForTeam - 1);
					num2 += num4;
				}
				args.healthTotalMult += num / 100f;
				args.moveSpeedMultAdd += num2 / 100f;
			}
		}

		private void SceneDirector_onPostPopulateSceneServer(SceneDirector self)
		{
			ActivateCount = 0;
			foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
			{
				if (!Object.op_Implicit((Object)(object)instance.master) || instance.master.inventory.GetItemCount(CollectorsCompassItem.ItemDef) <= 0)
				{
					continue;
				}
				MarkInteract();
				break;
			}
		}

		private void PurchaseInteraction_Awake(orig_Awake orig, PurchaseInteraction self)
		{
			//IL_000a: 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_0010: 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_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Expected I4, but got Unknown
			orig.Invoke(self);
			CostTypeIndex costType = self.costType;
			CostTypeIndex val = costType;
			bool flag;
			switch ((int)val)
			{
			case 0:
			case 1:
			case 2:
			case 4:
			case 5:
			case 6:
			case 7:
			case 10:
			case 15:
				flag = true;
				break;
			default:
				flag = false;
				break;
			}
			if (NetworkServer.active && flag && ((Component)self).gameObject.activeSelf)
			{
				((Component)self).gameObject.AddComponent<CompassList>();
			}
		}

		private void PurchaseInteraction_OnInteractionBegin(orig_OnInteractionBegin orig, PurchaseInteraction self, Interactor activator)
		{
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, activator);
			CompassList component = ((Component)self).gameObject.GetComponent<CompassList>();
			if (Object.op_Implicit((Object)(object)component) && component.IsMarked)
			{
				ReplaceMark(component, ((Component)self).gameObject);
			}
			else
			{
				if (!Object.op_Implicit((Object)(object)component) || !Object.op_Implicit((Object)(object)((Component)component).gameObject.GetComponent<ShopTerminalBehavior>()))
				{
					return;
				}
				MultiShopController val = ((Component)component).gameObject.GetComponent<ShopTerminalBehavior>()?.serverMultiShopController;
				if (!Object.op_Implicit((Object)(object)val) || val.available)
				{
					return;
				}
				GameObject[] terminalGameObjects = val.terminalGameObjects;
				foreach (GameObject val2 in terminalGameObjects)
				{
					CompassList component2 = val2.GetComponent<CompassList>();
					if (component2.IsMarked)
					{
						ReplaceMark(component2, val2);
						continue;
					}
					val2.GetComponent<Highlight>().highlightColor = (HighlightColor)0;
					val2.GetComponent<Highlight>().isOn = false;
				}
			}
		}

		private void BarrelInteraction_OnInteractionBegin(orig_OnInteractionBegin orig, BarrelInteraction self, Interactor activator)
		{
			orig.Invoke(self, activator);
			CompassList component = ((Component)self).gameObject.GetComponent<CompassList>();
			if (Object.op_Implicit((Object)(object)component) && component.IsMarked)
			{
				ReplaceMark(component, ((Component)self).gameObject);
			}
		}
	}
	public class GauzePadHooks
	{
		public static bool ItemEnabled;

		private EffectDef SplashEffect;

		public GauzePadHooks()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Expected O, but got Unknown
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Expected O, but got Unknown
			ItemEnabled = GauzePadItem.Item_Enabled.Value;
			if (ItemEnabled)
			{
				CreateSplashEffect();
				RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
				DotController.OnDotStackAddedServer += new hook_OnDotStackAddedServer(DotController_OnDotStackAddedServer);
				CharacterBody.AddBuff_BuffIndex += new hook_AddBuff_BuffIndex(CharacterBody_AddBuff_BuffIndex);
			}
		}

		private void CreateSplashEffect()
		{
			//IL_0006: 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_003a: 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_005d: 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_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Expected O, but got Unknown
			GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAsset<GameObject>((object)RoR2_Base_Phasing.ProcStealthkit_prefab).WaitForCompletion(), "GauzePadProc");
			EffectComponent component = val.GetComponent<EffectComponent>();
			Transform[] componentsInChildren = val.GetComponentsInChildren<Transform>();
			foreach (Transform val2 in componentsInChildren)
			{
				val2.localScale = Vector3.one * 0.5f;
			}
			SplashEffect = new EffectDef
			{
				prefab = val,
				prefabName = "GauzePadProc",
				prefabEffectComponent = component
			};
			ContentAddition.AddEffect(SplashEffect.prefab);
		}

		private void AddHealFromDebuff(CharacterBody self)
		{
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: 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)
			int itemCount = self.inventory.GetItemCount(GauzePadItem.ItemDef);
			if (itemCount > 0)
			{
				float num = GauzePadItem.Duration.Value;
				if (GauzePadItem.Duration_Stack.Value > 0f)
				{
					float num2 = GauzePadItem.Duration_Stack.Value * (float)(itemCount - 1);
					num += num2;
				}
				EffectManager.SimpleEffect(SplashEffect.prefab, self.corePosition, self.transform.rotation, true);
				NetworkingHelpers.ApplyBuff(self, HealFromDebuff.BuffDef.buffIndex, 1, num);
				Util.PlaySound("Play_scav_backpack_open", ((Component)self).gameObject);
			}
		}

		private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
		{
			if (!Object.op_Implicit((Object)(object)((sender != null) ? sender.inventory : null)))
			{
				return;
			}
			int itemCount = sender.inventory.GetItemCount(GauzePadItem.ItemDef);
			if (sender.HasBuff(HealFromDebuff.BuffDef) && itemCount > 0)
			{
				float num = GauzePadItem.Heal_Amount.Value;
				float num2 = num * GauzePadItem.Level_Scale;
				if (GauzePadItem.Heal_Amount_Stack.Value > 0f)
				{
					float num3 = GauzePadItem.Heal_Amount_Stack.Value * (float)(itemCount - 1);
					num += num3;
				}
				args.baseRegenAdd += num;
				args.levelRegenAdd += num2;
			}
		}

		private void DotController_OnDotStackAddedServer(orig_OnDotStackAddedServer orig, DotController self, DotStack dotStack)
		{
			orig.Invoke(self, dotStack);
			CharacterBody victimBody = self.victimBody;
			if ((Object)(object)dotStack.dotDef.associatedBuff != (Object)null && Object.op_Implicit((Object)(object)((victimBody != null) ? victimBody.inventory : null)))
			{
				AddHealFromDebuff(victimBody);
			}
		}

		private void CharacterBody_AddBuff_BuffIndex(orig_AddBuff_BuffIndex orig, CharacterBody self, BuffIndex buffType)
		{
			//IL_0003: 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)
			orig.Invoke(self, buffType);
			BuffDef buffDef = BuffCatalog.GetBuffDef(buffType);
			if (Object.op_Implicit((Object)(object)buffDef) && Object.op_Implicit((Object)(object)((self != null) ? self.inventory : null)) && buffDef.isDebuff && !buffDef.isDOT)
			{
				AddHealFromDebuff(self);
			}
		}
	}
	public class IVBagHooks
	{
		public static bool ItemEnabled;

		public static GameObject TetherPrefab;

		public static ModdedProcType HealShare;

		public IVBagHooks()
		{
			//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)
			ItemEnabled = IVBagItem.Item_Enabled.Value;
			if (ItemEnabled)
			{
				CreateTether();
				HealthComponent.onCharacterHealServer += HealthComponent_onCharacterHealServer;
				NetworkingAPI.RegisterMessageType<IVBagTether.IVTetherSync>();
				HealShare = ProcTypeAPI.ReserveProcType();
			}
		}

		private void HealthComponent_onCharacterHealServer(HealthComponent self, float amount, ProcChainMask procChainMask)
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: 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_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			CharacterBody component = ((Component)self).GetComponent<CharacterBody>();
			IVBagTether iVBagTether = ((component != null) ? ((Component)component).GetComponent<IVBagTether>() : null);
			int num = (Object.op_Implicit((Object)(object)((component != null) ? component.inventory : null)) ? component.inventory.GetItemCount(IVBagItem.ItemDef) : 0);
			bool flag = ProcTypeAPI.HasModdedProc(procChainMask, HealShare);
			if (!(amount > 0.5f) || iVBagTether == null || iVBagTether.TargetLinks.Count <= 0 || flag)
			{
				return;
			}
			foreach (Transform targetLink in iVBagTether.TargetLinks)
			{
				HealthComponent component2 = ((Component)targetLink).GetComponent<HealthComponent>();
				if (Object.op_Implicit((Object)(object)component2))
				{
					ProcChainMask val = default(ProcChainMask);
					ProcTypeAPI.AddModdedProc(ref val, HealShare);
					float num2 = IVBagItem.Heal_Percent.Value;
					if (IVBagItem.Heal_Percent_Stack.Value > 0f)
					{
						float num3 = IVBagItem.Heal_Percent_Stack.Value * (float)(num - 1);
						num2 += num3;
					}
					component2.Heal(amount * num2 / 100f, val, true);
					NetMessageExtensions.Send((INetMessage)(object)new IVBagTether.IVTetherSync(((NetworkBehaviour)component).netId), (NetworkDestination)1);
				}
			}
		}

		private void CreateTether()
		{
			//IL_0006: 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_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			//IL_0050: 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: Expected O, but got Unknown
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			TetherPrefab = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)RoR2_DLC1_EliteEarth.AffixEarthTetherVFX_prefab).WaitForCompletion(), "IVBagTether", true);
			LineRenderer component = TetherPrefab.GetComponent<LineRenderer>();
			Material val = new Material(((Renderer)component).sharedMaterial);
			val.SetColor("_TintColor", new Color(0f, 0f, 0f));
			RendererSetMaterialsExtension.SetSharedMaterials((Renderer)(object)component, (Material[])(object)new Material[1] { val }, 1);
			Object.Destroy((Object)(object)((Component)TetherPrefab.transform.Find("EndTransform/HealedFX/HealingSymbols_Ps")).gameObject);
			Object.Destroy((Object)(object)((Component)TetherPrefab.transform.Find("EndTransform/HealedFX/HealingGlow_Ps")).gameObject);
			Object.Destroy((Object)(object)TetherPrefab.GetComponent<LoopSoundPlayer>());
			ParticleSystemRenderer component2 = ((Component)TetherPrefab.transform.Find("EndTransform/HealedFX/HealingGlow_Ps (1)")).GetComponent<ParticleSystemRenderer>();
			Material val2 = new Material(((Renderer)component2).sharedMaterial);
			val2.SetColor("_TintColor", new Color(0f, 0f, 0f));
			((Renderer)component2).sharedMaterial = val2;
		}

		private void CharacterBody_OnInventoryChanged(orig_OnInventoryChanged orig, CharacterBody self)
		{
			orig.Invoke(self);
			if (Object.op_Implicit((Object)(object)((self != null) ? self.inventory : null)) && NetworkServer.active)
			{
				IVBagTether component = ((Component)self).GetComponent<IVBagTether>();
				int itemCount = self.inventory.GetItemCount(IVBagItem.ItemDef);
				if (Object.op_Implicit((Object)(object)component) && itemCount <= 0)
				{
					Object.Destroy((Object)(object)component);
				}
				if (!Object.op_Implicit((Object)(object)component) && itemCount > 0)
				{
					((Component)self).gameObject.AddComponent<IVBagTether>();
				}
			}
		}
	}
	public class IVBagTether : BaseItemBodyBehavior
	{
		public class IVTetherSync : INetMessage, ISerializableObject
		{
			private NetworkInstanceId NetID;

			public IVTetherSync()
			{
			}

			public IVTetherSync(NetworkInstanceId setID)
			{
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				//IL_0009: Unknown result type (might be due to invalid IL or missing references)
				NetID = setID;
			}

			public void Deserialize(NetworkReader reader)
			{
				//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)
				NetID = reader.ReadNetworkId();
			}

			public void OnReceived()
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				GameObject val = Util.FindNetworkObject(NetID);
				IVBagTether iVBagTether = ((val != null) ? val.GetComponent<IVBagTether>() : null);
				if (Object.op_Implicit((Object)(object)iVBagTether))
				{
					iVBagTether.TriggerVisual();
				}
			}

			public void Serialize(NetworkWriter writer)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				writer.Write(NetID);
			}
		}

		public List<Transform> TargetLinks;

		public List<GameObject> ActiveTethers;

		private List<Renderer> TetherRenders;

		private CharacterBody Owner;

		private MaterialPropertyBlock PropertySet;

		private TetherVfxOrigin TetherEffect;

		public float Duration;

		private float GlowHue;

		[ItemDefAssociation(useOnServer = true, useOnClient = true)]
		public static ItemDef GetItemDef()
		{
			return IVBagItem.Item_Enabled.Value ? IVBagItem.ItemDef : null;
		}

		public void OnEnable()
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Expected O, but got Unknown
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Expected O, but got Unknown
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Expected O, but got Unknown
			Owner = ((Component)this).GetComponent<CharacterBody>();
			TetherEffect = ((Component)this).gameObject.AddComponent<TetherVfxOrigin>();
			TetherEffect.tetherPrefab = IVBagHooks.TetherPrefab;
			Duration = 0f;
			GlowHue = 0f;
			PropertySet = new MaterialPropertyBlock();
			TetherVfxOrigin tetherEffect = TetherEffect;
			tetherEffect.onTetherAdded = (TetherAddDelegate)Delegate.Combine((Delegate?)(object)tetherEffect.onTetherAdded, (Delegate?)new TetherAddDelegate(SetUpTether));
			TetherVfxOrigin tetherEffect2 = TetherEffect;
			tetherEffect2.onTetherRemoved = (TetherRemoveDelegate)Delegate.Combine((Delegate?)(object)tetherEffect2.onTetherRemoved, (Delegate?)new TetherRemoveDelegate(RemoveTether));
			TargetLinks = new List<Transform>();
			ActiveTethers = new List<GameObject>();
			TetherRenders = new List<Renderer>();
		}

		public void SetUpTether(TetherVfx tether, Transform transform)
		{
			GameObject gameObject = ((Component)tether).gameObject;
			Renderer component = ((Component)gameObject.GetComponent<LineRenderer>()).GetComponent<Renderer>();
			Transform obj = gameObject.transform.Find("EndTransform/HealedFX/HealingGlow_Ps (1)");
			Renderer item = ((obj != null) ? ((Component)((Component)obj).GetComponent<ParticleSystemRenderer>()).GetComponent<Renderer>() : null);
			ActiveTethers.Add(gameObject);
			TetherRenders.Add(component);
			TetherRenders.Add(item);
		}

		public void RemoveTether(TetherVfx tether)
		{
			GameObject gameObject = ((Component)tether).gameObject;
			Renderer component = ((Component)gameObject.GetComponent<LineRenderer>()).GetComponent<Renderer>();
			Transform obj = gameObject.transform.Find("EndTransform/HealedFX/HealingGlow_Ps (1)");
			Renderer item = ((obj != null) ? ((Component)((Component)obj).GetComponent<ParticleSystemRenderer>()).GetComponent<Renderer>() : null);
			if (ActiveTethers.Contains(gameObject))
			{
				ActiveTethers.Remove(gameObject);
			}
			if (TetherRenders.Contains(component))
			{
				TetherRenders.Remove(component);
			}
			if (TetherRenders.Contains(item))
			{
				TetherRenders.Remove(item);
			}
		}

		public void OnDestroy()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected O, but got Unknown
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Expected O, but got Unknown
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Expected O, but got Unknown
			TetherVfxOrigin tetherEffect = TetherEffect;
			tetherEffect.onTetherAdded = (TetherAddDelegate)Delegate.Remove((Delegate?)(object)tetherEffect.onTetherAdded, (Delegate?)new TetherAddDelegate(SetUpTether));
			TetherVfxOrigin tetherEffect2 = TetherEffect;
			tetherEffect2.onTetherRemoved = (TetherRemoveDelegate)Delegate.Remove((Delegate?)(object)tetherEffect2.onTetherRemoved, (Delegate?)new TetherRemoveDelegate(RemoveTether));
			Object.Destroy((Object)(object)TetherEffect);
		}

		public void Update()
		{
			//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)
			//IL_0042: 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_0094: 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_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: 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_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Expected O, but got Unknown
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			Duration = Math.Max(0f, Duration - Time.deltaTime);
			TargetLinks.Clear();
			List<HurtBox> list = CollectionPool<HurtBox, List<HurtBox>>.RentCollection();
			TeamMask val = TeamMask.none;
			((TeamMask)(ref val)).AddTeam(Owner.teamComponent.teamIndex);
			int itemCount = Owner.inventory.GetItemCount(IVBagItem.ItemDef);
			float num = IVBagItem.Radius.Value;
			if (RunArtifactManager.instance.IsArtifactEnabled(Artifacts.FriendlyFire))
			{
				val = TeamMask.GetEnemyTeams(Owner.teamComponent.teamIndex);
				((TeamMask)(ref val)).AddTeam(Owner.teamComponent.teamIndex);
			}
			if (IVBagItem.Radius_Stack.Value > 0f)
			{
				float num2 = IVBagItem.Radius_Stack.Value * (float)(itemCount - 1);
				num += num2;
			}
			SphereSearch val2 = new SphereSearch
			{
				radius = num,
				origin = Owner.transform.position,
				mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask,
				queryTriggerInteraction = (QueryTriggerInteraction)0
			};
			val2.RefreshCandidates();
			val2.FilterCandidatesByHurtBoxTeam(val);
			val2.OrderCandidatesByDistance();
			val2.FilterCandidatesByDistinctHurtBoxEntities();
			val2.GetHurtBoxes(list);
			int num3 = IVBagItem.Target_Count.Value;
			if (IVBagItem.Target_Count_Stack.Value > 0)
			{
				int num4 = IVBagItem.Target_Count_Stack.Value * (itemCount - 1);
				num3 += num4;
			}
			int num5 = 0;
			int num6 = Math.Min(num3, list.Count);
			while (TargetLinks.Count < num6 && num5 < list.Count)
			{
				CharacterBody val3 = list[num5]?.healthComponent.body;
				if ((Object)(object)val3 != (Object)(object)Owner)
				{
					TargetLinks.Add(val3.transform);
				}
				num5++;
			}
		}

		public void LateUpdate()
		{
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			TetherEffect.SetTetheredTransforms(TargetLinks);
			float glowHue = Mathf.MoveTowards(GlowHue, (Duration > 0f) ? 2f : 0f, Time.deltaTime * 15f);
			Color val = default(Color);
			((Color)(ref val))..ctor(GlowHue, GlowHue, GlowHue);
			GlowHue = glowHue;
			PropertySet.SetColor("_TintColor", val);
			foreach (Renderer tetherRender in TetherRenders)
			{
				tetherRender.SetPropertyBlock(PropertySet);
			}
		}

		public void TriggerVisual()
		{
			Duration = 0.5f;
			Util.PlaySound("Play_treeBot_m1_hit_heal", ((Component)Owner).gameObject);
		}
	}
	public class JellyBagHooks
	{
		public static bool ItemEnabled;

		public static EffectDef OrbEffect;

		public static EffectDef HitEffect;

		public static GameObject RadiusEffect;

		public JellyBagHooks()
		{
			ItemEnabled = JellyBagItem.Item_Enabled.Value;
			if (ItemEnabled)
			{
				CreateOrbEffect();
				CreateHitEffect();
				CreateRadiusEffect();
				GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
			}
		}

		private void CreateOrbEffect()
		{
			//IL_0006: 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_0024: 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_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Expected O, but got Unknown
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Expected O, but got Unknown
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Expected O, but got Unknown
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Expected O, but got Unknown
			GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)RoR2_Base_Infusion.InfusionOrbEffect_prefab).WaitForCompletion(), "JellyBagOrbEffect");
			Texture val2 = Addressables.LoadAssetAsync<Texture>((object)RoR2_Base_Common_ColorRamps.texRampTritone2_png).WaitForCompletion();
			EffectComponent component = val.GetComponent<EffectComponent>();
			OrbEffect component2 = val.GetComponent<OrbEffect>();
			ParticleSystem component3 = ((Component)val.transform.Find("VFX/PulseGlow")).GetComponent<ParticleSystem>();
			component3.startColor = new Color(0.224f, 0.118f, 1f, 0.2f);
			ParticleSystemRenderer component4 = ((Component)val.transform.Find("VFX/Core")).GetComponent<ParticleSystemRenderer>();
			Material val3 = new Material(((Renderer)component4).sharedMaterial);
			val3.DisableKeyword("VERTEXCOLOR");
			val3.SetColor("_TintColor", new Color(0.224f, 0.118f, 1f));
			val3.SetTexture("_RemapTex", val2);
			((Renderer)component4).sharedMaterial = val3;
			TrailRenderer component5 = ((Component)val.transform.Find("TrailParent/Trail")).GetComponent<TrailRenderer>();
			Material val4 = new Material(((Renderer)component5).sharedMaterial);
			val4.DisableKeyword("VERTEXCOLOR");
			val4.SetColor("_TintColor", new Color(0.224f, 0.118f, 1f));
			val4.SetTexture("_RemapTex", val2);
			((Renderer)component5).sharedMaterial = val4;
			if (Object.op_Implicit((Object)(object)component2))
			{
				component2.onArrival = new UnityEvent();
			}
			OrbEffect = new EffectDef
			{
				prefab = val,
				prefabName = "JellyBagOrbEffect",
				prefabEffectComponent = component
			};
			ContentAddition.AddEffect(OrbEffect.prefab);
		}

		private void CreateHitEffect()
		{
			//IL_0006: 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_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Expected O, but got Unknown
			GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)RoR2_Base_LunarSkillReplacements.LunarSecondaryRootEffect_prefab).WaitForCompletion(), "JellyBagHitProc");
			EffectComponent val2 = val.AddComponent<EffectComponent>();
			DestroyOnTimer component = val.GetComponent<DestroyOnTimer>();
			TemporaryVisualEffect component2 = val.GetComponent<TemporaryVisualEffect>();
			ParticleSystem component3 = ((Component)val.transform.Find("Visual/Sparks")).GetComponent<ParticleSystem>();
			component3.playbackSpeed = 1.5f;
			component3.emissionRate = 15f;
			component3.maxParticles = 25;
			component3.startSpeed = 5f;
			Object.Destroy((Object)(object)((Component)val.transform.Find("Visual/Feathers")).gameObject);
			Object.Destroy((Object)(object)((Component)val.transform.Find("Visual/Core Slashes")).gameObject);
			Object.Destroy((Object)(object)((Component)val.transform.Find("Visual/Rising Rings")).gameObject);
			Object.Destroy((Object)(object)component2);
			component.duration = 0.25f;
			((Behaviour)component).enabled = true;
			val2.parentToReferencedTransform = true;
			val2.positionAtReferencedTransform = true;
			val2.applyScale = true;
			HitEffect = new EffectDef
			{
				prefab = val,
				prefabName = "JellyBagHitProc",
				prefabEffectComponent = val2
			};
			ContentAddition.AddEffect(HitEffect.prefab);
		}

		private void CreateRadiusEffect()
		{
			//IL_0006: 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_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)RoR2_Base_NearbyDamageBonus.NearbyDamageBonusIndicator_prefab).WaitForCompletion(), "JellyBagIndicator");
			MeshRenderer component = ((Component)val.transform.Find("Radius, Spherical")).GetComponent<MeshRenderer>();
			Material val2 = new Material(((Renderer)component).sharedMaterial);
			val2.SetColor("_TintColor", new Color(0.357f, 0f, 0.957f, 1f));
			((Renderer)component).sharedMaterial = val2;
			Object.Destroy((Object)(object)val.GetComponent<NetworkedBodyAttachment>());
			val.AddComponent<NetworkParent>();
			RadiusEffect = val;
		}

		private void GlobalEventManager_onServerDamageDealt(DamageReport damageReport)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: 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_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0154: Unknown result type (might be due to invalid IL or missing references)
			//IL_0277: 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)
			CharacterBody victimBody = damageReport.victimBody;
			HealthComponent val = ((victimBody != null) ? ((Component)victimBody).GetComponent<HealthComponent>() : null);
			TeamIndex victimTeamIndex = damageReport.victimTeamIndex;
			if (!Object.op_Implicit((Object)(object)val) || Util.GetItemCountForTeam(victimTeamIndex, JellyBagItem.ItemDef.itemIndex, true, true) <= 0)
			{
				return;
			}
			float num = damageReport.damageDealt / val.fullCombinedHealth;
			ReadOnlyCollection<TeamComponent> teamMembers = TeamComponent.GetTeamMembers(victimTeamIndex);
			List<CharacterBody> list = new List<CharacterBody>();
			foreach (TeamComponent item in teamMembers)
			{
				CharacterBody body = item.body;
				int num2 = (Object.op_Implicit((Object)(object)body.inventory) ? body.inventory.GetItemCount(JellyBagItem.ItemDef) : 0);
				if (!((Object)(object)body == (Object)(object)victimBody) && Object.op_Implicit((Object)(object)body.inventory) && num2 != 0)
				{
					list.Add(body);
				}
			}
			foreach (CharacterBody item2 in list)
			{
				if (!Object.op_Implicit((Object)(object)item2.inventory))
				{
					continue;
				}
				Vector3 val2 = victimBody.transform.position - item2.transform.position;
				float sqrMagnitude = ((Vector3)(ref val2)).sqrMagnitude;
				int itemCount = item2.inventory.GetItemCount(JellyBagItem.ItemDef);
				float num3 = JellyBagItem.Radius.Value;
				float num4 = JellyBagItem.Threshold.Value / 100f;
				if (JellyBagItem.Threshold_Stack.Value < 0f)
				{
					float num5 = Mathf.Pow(1f + JellyBagItem.Threshold_Stack.Value / 100f, (float)(itemCount - 1));
					num4 *= num5;
				}
				if (JellyBagItem.Radius_Stack.Value > 0f)
				{
					float num6 = JellyBagItem.Radius_Stack.Value * (float)(itemCount - 1);
					num3 += num6;
				}
				if (num >= num4 && (double)sqrMagnitude <= Math.Pow(num3, 2.0))
				{
					float num7 = JellyBagItem.Heal_Percent.Value;
					if (JellyBagItem.Heal_Percent_Stack.Value > 0f)
					{
						float num8 = JellyBagItem.Heal_Percent_Stack.Value * (float)(itemCount - 1);
						num7 += num8;
					}
					OrbManager.instance.AddOrb((Orb)(object)new JellyBagOrb
					{
						origin = victimBody.corePosition,
						target = item2.mainHurtBox,
						healAmount = damageReport.damageDealt * num7 / 100f
					});
				}
			}
		}
	}
	public class JellyBagIndicator : BaseItemBodyBehavior
	{
		private GameObject RadiusPrefab;

		private GameObject SphereIndicator;

		[ItemDefAssociation(useOnServer = true, useOnClient = true)]
		public static ItemDef GetItemDef()
		{
			return JellyBagItem.Item_Enabled.Value ? JellyBagItem.ItemDef : null;
		}

		public void OnEnable()
		{
			Inventory.onInventoryChangedGlobal += UpdateVisual;
			CharacterBody body = ((BaseItemBodyBehavior)this).body;
			body.OnNetworkItemBehaviorUpdate = (Action<NetworkItemBehaviorData>)Delegate.Combine(body.OnNetworkItemBehaviorUpdate, new Action<NetworkItemBehaviorData>(HandleNetworkItemBehaviorUpdate));
		}

		public void OnDisable()
		{
			Inventory.onInventoryChangedGlobal -= UpdateVisual;
			CharacterBody body = ((BaseItemBodyBehavior)this).body;
			body.OnNetworkItemBehaviorUpdate = (Action<NetworkItemBehaviorData>)Delegate.Remove(body.OnNetworkItemBehaviorUpdate, new Action<NetworkItemBehaviorData>(HandleNetworkItemBehaviorUpdate));
			SetPrefab(active: false);
		}

		private void UpdateVisual(Inventory inventory)
		{
			//IL_00a4: 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)
			CharacterMaster component = ((Component)inventory).GetComponent<CharacterMaster>();
			CharacterBody val = (Object.op_Implicit((Object)(object)component) ? component.GetBody() : null);
			if (!Object.op_Implicit((Object)(object)val) || !((Object)(object)val == (Object)(object)((BaseItemBodyBehavior)this).body))
			{
				return;
			}
			int itemCount = inventory.GetItemCount(JellyBagItem.ItemDef);
			SetPrefab(active: true);
			if (itemCount > 0)
			{
				float num = JellyBagItem.Radius.Value;
				if (JellyBagItem.Radius_Stack.Value > 0f)
				{
					float num2 = JellyBagItem.Radius_Stack.Value * (float)(itemCount - 1);
					num += num2;
				}
				SetRadius(num);
				val.TransmitItemBehavior(new NetworkItemBehaviorData(JellyBagItem.ItemDef.itemIndex, num), false);
			}
		}

		public void HandleNetworkItemBehaviorUpdate(NetworkItemBehaviorData itemBehaviorData)
		{
			//IL_0003: 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_0019: Unknown result type (might be due to invalid IL or missing references)
			if (((NetworkItemBehaviorData)(ref itemBehaviorData)).itemIndex == JellyBagItem.ItemDef.itemIndex)
			{
				SetRadius(itemBehaviorData.floatValue);
			}
		}

		private void SetPrefab(bool active)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			if (active && !Object.op_Implicit((Object)(object)RadiusPrefab))
			{
				RadiusPrefab = Object.Instantiate<GameObject>(JellyBagHooks.RadiusEffect, ((Component)((BaseItemBodyBehavior)this).body).GetComponent<CharacterBody>().corePosition, Quaternion.identity);
				SphereIndicator = ((Component)RadiusPrefab.transform.Find("Radius, Spherical")).gameObject;
				RadiusPrefab.transform.SetParent(((Component)((BaseItemBodyBehavior)this).body).GetComponent<CharacterBody>().transform);
			}
			else if (!active)
			{
				Object.Destroy((Object)(object)RadiusPrefab);
				RadiusPrefab = null;
				SphereIndicator = null;
			}
		}

		private void SetRadius(float diameter)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)SphereIndicator))
			{
				SphereIndicator.transform.localScale = Vector3.one * diameter * 2f;
			}
		}
	}
	public class JellyBagOrb : Orb
	{
		private static readonly float Speed = 30f;

		public float healAmount;

		public override void Begin()
		{
			//IL_0014: 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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			((Orb)this).duration = ((Orb)this).distanceToTarget / Speed;
			EffectData val = new EffectData
			{
				origin = base.origin,
				genericFloat = ((Orb)this).duration,
				scale = 1.75f
			};
			val.SetHurtBoxReference(base.target);
			EffectManager.SpawnEffect(JellyBagHooks.OrbEffect.prefab, val, true);
		}

		public override void OnArrival()
		{
			//IL_0040: 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_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Expected O, but got Unknown
			((Orb)this).OnArrival();
			HealthComponent healthComponent = base.target.healthComponent;
			CharacterBody val = healthComponent?.body;
			if (Object.op_Implicit((Object)(object)((val != null) ? val.inventory : null)))
			{
				healthComponent.Heal(healAmount, default(ProcChainMask), true);
				Util.PlaySound("Play_UI_arenaMode_voidCollapse_select", ((Component)val).gameObject);
				EffectManager.SpawnEffect(JellyBagHooks.HitEffect.prefab, new EffectData
				{
					rootObject = ((Component)val).gameObject,
					rotation = Quaternion.identity
				}, true);
			}
		}
	}
	public class PottingSoilHooks
	{
		public static bool ItemEnabled;

		public PottingSoilHooks()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			ItemEnabled = PottingSoilItem.Item_Enabled.Value;
			if (ItemEnabled)
			{
				GlobalEventManager.OnInteractionBegin += new hook_OnInteractionBegin(GlobalEventManager_OnInteractionBegin);
			}
		}

		private void GlobalEventManager_OnInteractionBegin(orig_OnInteractionBegin orig, GlobalEventManager self, Interactor interactor, IInteractable interactable, GameObject interactableObject)
		{
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Expected O, but got Unknown
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: 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_007f: 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_0089: 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_00a1: Expected O, but got Unknown
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Expected O, but got Unknown
			orig.Invoke(self, interactor, interactable, interactableObject);
			CharacterBody component = ((Component)interactor).GetComponent<CharacterBody>();
			if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.inventory))
			{
				int itemCount = component.inventory.GetItemCount(PottingSoilItem.ItemDef);
				if (itemCount > 0 && PermittedInteractSpawn((MonoBehaviour)interactable, interactableObject))
				{
					SpawnCard val = (SpawnCard)(object)LegacyResourcesAPI.Load<CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscSquidTurret");
					DirectorPlacementRule val2 = new DirectorPlacementRule
					{
						placementMode = (PlacementMode)1,
						position = interactableObject.transform.position,
						maxDistance = 20f,
						minDistance = 5f
					};
					DirectorSpawnRequest val3 = new DirectorSpawnRequest(val, val2, RoR2Application.rng)
					{
						teamIndexOverride = (TeamIndex)1,
						summonerBodyObject = ((Component)interactor).gameObject
					};
					DirectorCore.instance.TrySpawnObject(val3);
				}
			}
		}

		private bool PermittedInteractSpawn(MonoBehaviour interactMonoBehaviour, GameObject interactObject)
		{
			if (!Object.op_Implicit((Object)(object)interactMonoBehaviour))
			{
				return false;
			}
			InteractionProcFilter component = interactObject.GetComponent<InteractionProcFilter>();
			if (Object.op_Implicit((Object)(object)component))
			{
				return component.shouldAllowOnInteractionBeginProc;
			}
			if (Object.op_Implicit((Object)(object)((Component)interactMonoBehaviour).GetComponent<DelusionChestController>()))
			{
				if (((Behaviour)((Component)interactMonoBehaviour).GetComponent<PickupPickerController>()).enabled)
				{
					return false;
				}
				return true;
			}
			if (Object.op_Implicit((Object)(object)((Component)interactMonoBehaviour).GetComponent<VehicleSeat>()))
			{
				return false;
			}
			if (Object.op_Implicit((Object)(object)((Component)interactMonoBehaviour).GetComponent<GenericPickupController>()))
			{
				return false;
			}
			if (Object.op_Implicit((Object)(object)((Component)interactMonoBehaviour).GetComponent<NetworkUIPromptController>()))
			{
				return false;
			}
			return true;
		}
	}
	internal static class Log
	{
		private static ManualLogSource _logSource;

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

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

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

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

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

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

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

		public const string PluginCreator = "noodleGemo";

		public const string PluginName = "ScalesoftheAsclepius";

		public const string PluginVersion = "1.0.3";

		public static readonly string TokenPrefix = "GEMO_SOTA_";

		public static ExpansionDef ScalesAsclepiusExp;

		public static ItemRelationshipProvider VoidRelationship;

		public static SotAPlugin Instance { get; private set; }

		public static AssetBundle Bundle { get; private set; }

		public void Awake()
		{
			Instance = this;
			SetUpAssets();
			PluginConfig.Init();
			if (PluginConfig.Enable_Logging.Value)
			{
				Log.Init(((BaseUnityPlugin)this).Logger);
			}
			CreateContent();
		}

		private void CreateContent()
		{
			CreateExpansion();
			CreateBuffs();
			CreateItems();
			CreateVoidRelationship();
		}

		private void CreateExpansion()
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			string description = "Scales of the Asclepius";
			string description2 = "Adds content from the 'Scales of the Asclepius' expansion to the game.";
			ScalesAsclepiusExp = ScriptableObject.CreateInstance<ExpansionDef>();
			((Object)ScalesAsclepiusExp).name = "scaleAsclepiusIcon";
			ScalesAsclepiusExp.iconSprite = Bundle.LoadAsset<Sprite>("expansionIcon");
			ScalesAsclepiusExp.disabledIconSprite = Addressables.LoadAssetAsync<Sprite>((object)RoR2_Base_Common_MiscIcons.texUnlockIcon_png).WaitForCompletion();
			ScalesAsclepiusExp.nameToken = SALanguage.LanguageAdd("EXPANSION_ICON", description);
			ScalesAsclepiusExp.descriptionToken = SALanguage.LanguageAdd("EXPANSION_DESC", description2);
			ContentAddition.AddExpansionDef(ScalesAsclepiusExp);
		}

		private void CreateVoidRelationship()
		{
			//IL_0025: 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_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: 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_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: 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)
			VoidRelationship = ScriptableObject.CreateInstanc