Decompiled source of NewtDrop v2.0.0

NewtDrop.dll

Decompiled 5 months ago
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using On.RoR2;
using R2API;
using R2API.Utils;
using RoR2;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("NewtDrop")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NewtDrop")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("254c74c4-954d-47e9-83cb-712e1de44379")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace NewtDrop;

internal class CeremonialFireworks
{
	internal static AssetBundle Bundle;

	public static ConfigFile Config;

	private static ItemDef CeremonialFireworksDef;

	private static readonly int BaseFireworkNum = 8;

	private static readonly int ScalingFireworkNum = 4;

	private static readonly int BasePercentage = 50;

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

	internal static void Init()
	{
		Config = NewtDrop.NewtConfig;
		Bundle = NewtDrop.bundle;
		CreateConfig();
		if (EnableCeremonialFireworksConfig.Value)
		{
			CreateItem();
			Hooks();
		}
	}

	private static void CreateConfig()
	{
		EnableCeremonialFireworksConfig = Config.Bind<bool>("Items", "Ceremonial Fireworks", true, "Enable this item?");
	}

	private static void CreateItem()
	{
		//IL_005d: 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_00b5: Expected O, but got Unknown
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: Expected O, but got Unknown
		CeremonialFireworksDef = ScriptableObject.CreateInstance<ItemDef>();
		((Object)CeremonialFireworksDef).name = "CF";
		CeremonialFireworksDef.nameToken = "CF";
		CeremonialFireworksDef.descriptionToken = "CF_Desc";
		CeremonialFireworksDef.loreToken = "CF_Lore";
		CeremonialFireworksDef.pickupToken = "CF_Pickup";
		CeremonialFireworksDef.deprecatedTier = (ItemTier)2;
		CeremonialFireworksDef.pickupIconSprite = Bundle.LoadAsset<Sprite>("Assets/CeremonialFireworks.png");
		CeremonialFireworksDef.pickupModelPrefab = Resources.Load<GameObject>("Prefabs/PickupModels/PickupFirework");
		CeremonialFireworksDef.canRemove = true;
		CeremonialFireworksDef.hidden = false;
		ItemAPI.Add(new CustomItem(CeremonialFireworksDef, new ItemDisplayRuleDict((ItemDisplayRule[])null)));
		LanguageAPI.Add("CF", "Ceremonial Fireworks");
		LanguageAPI.Add("CF_Pickup", "Chance to launch fireworks on kill");
		LanguageAPI.Add("CF_Desc", $"<style=cIsUtility>{BasePercentage}%</style> chance to launch {BaseFireworkNum} <style=cStack>(+{ScalingFireworkNum} per stack)</style> fireworks on <style=cIsDamage>enemy kill</style> that deal <style=cIsUtility>300%</style> base damage");
		LanguageAPI.Add("CF_Lore", "When daggers aren't explosive enough");
	}

	private static void Hooks()
	{
		GlobalEventManager.onCharacterDeathGlobal += delegate(DamageReport report)
		{
			SpawnFireworks(report);
		};
	}

	private static void SpawnFireworks(DamageReport report)
	{
		//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)
		if (!Utils.DamageReportNullCheck(report))
		{
			int itemCount = report.attackerBody.inventory.GetItemCount(CeremonialFireworksDef);
			if (itemCount > 0 && Util.CheckRoll((float)BasePercentage, report.attackerBody.master))
			{
				int remaining = BaseFireworkNum + (itemCount - 1) * ScalingFireworkNum;
				FireworkLauncher component = Object.Instantiate<GameObject>(Resources.Load<GameObject>("Prefabs/FireworkLauncher"), report.victimBody.corePosition, Quaternion.identity).GetComponent<FireworkLauncher>();
				component.owner = ((Component)report.attackerBody).gameObject;
				component.crit = Util.CheckRoll(report.attackerBody.crit, report.attackerBody.master);
				component.remaining = remaining;
			}
		}
	}
}
internal class Prowler
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static Action<DamageReport> <>9__14_0;

		public static hook_OnBodyDamaged <>9__14_1;

		public static hook_RecalculateStats <>9__14_2;

		internal void <Hooks>b__14_0(DamageReport report)
		{
			ProwlerCleanse(report);
		}

		internal void <Hooks>b__14_1(orig_OnBodyDamaged orig, CharacterMaster self, DamageReport report)
		{
			RemoveNextCrit(report);
			orig.Invoke(self, report);
		}

		internal void <Hooks>b__14_2(orig_RecalculateStats orig, CharacterBody self)
		{
			AddNextCrit(self);
			orig.Invoke(self);
		}
	}

	internal static AssetBundle Bundle;

	public static ConfigFile Config;

	private static ItemDef ProwlerDef;

	private static BuffDef NextCrit;

	private static readonly int BasePercentage = 40;

	private static readonly int ScalingPercentage = 25;

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

	internal static void Init()
	{
		Config = NewtDrop.NewtConfig;
		Bundle = NewtDrop.bundle;
		CreateConfig();
		if (ProwlerConfig.Value)
		{
			CreateItem();
			CreateBuffs();
			Hooks();
		}
	}

	private static void CreateConfig()
	{
		ProwlerConfig = Config.Bind<bool>("Items", "Prowler", true, "Enable this item?");
	}

	private static void CreateItem()
	{
		//IL_005d: 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_00b5: Expected O, but got Unknown
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: Expected O, but got Unknown
		ProwlerDef = ScriptableObject.CreateInstance<ItemDef>();
		((Object)ProwlerDef).name = "Prowler";
		ProwlerDef.nameToken = "Prowler_Name";
		ProwlerDef.descriptionToken = "Prowler_Desc";
		ProwlerDef.loreToken = "Prowler_Lore";
		ProwlerDef.pickupToken = "Prowler_Pickup";
		ProwlerDef.deprecatedTier = (ItemTier)2;
		ProwlerDef.pickupIconSprite = Bundle.LoadAsset<Sprite>("Assets/Prowler.png");
		ProwlerDef.pickupModelPrefab = Resources.Load<GameObject>("Prefabs/PickupModels/PickupFireballsOnHit");
		ProwlerDef.canRemove = true;
		ProwlerDef.hidden = false;
		ItemAPI.Add(new CustomItem(ProwlerDef, new ItemDisplayRuleDict((ItemDisplayRule[])null)));
		LanguageAPI.Add("Prowler_Name", "Prowler");
		LanguageAPI.Add("Prowler_Pickup", "On elite kill, crit next target and gain a chance to cleanse all debuffs");
		LanguageAPI.Add("Prowler_Desc", $"On elite kill, gain <style=cIsUtility>+100%</style> crit chance for next attack, and get <style=cIsUtility>{BasePercentage}%</style> <style=cStack>(+{ScalingPercentage}% per stack)</style> chance to cleanse all debuffs");
		LanguageAPI.Add("Prowler_Lore", "Chain those band procs");
	}

	private static void CreateBuffs()
	{
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_0025: Unknown result type (might be due to invalid IL or missing references)
		NextCrit = ScriptableObject.CreateInstance<BuffDef>();
		((Object)NextCrit).name = "NextCrit";
		NextCrit.buffColor = Color.red;
		NextCrit.canStack = false;
		NextCrit.isDebuff = false;
		NextCrit.iconSprite = Resources.Load<Sprite>("Textures/ItemIcons/texGlassesIcon");
		ContentAddition.AddBuffDef(NextCrit);
	}

	private static void Hooks()
	{
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0045: Expected O, but got Unknown
		//IL_005f: 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_006a: Expected O, but got Unknown
		GlobalEventManager.onCharacterDeathGlobal += delegate(DamageReport report)
		{
			ProwlerCleanse(report);
		};
		object obj = <>c.<>9__14_1;
		if (obj == null)
		{
			hook_OnBodyDamaged val = delegate(orig_OnBodyDamaged orig, CharacterMaster self, DamageReport report)
			{
				RemoveNextCrit(report);
				orig.Invoke(self, report);
			};
			<>c.<>9__14_1 = val;
			obj = (object)val;
		}
		CharacterMaster.OnBodyDamaged += (hook_OnBodyDamaged)obj;
		object obj2 = <>c.<>9__14_2;
		if (obj2 == null)
		{
			hook_RecalculateStats val2 = delegate(orig_RecalculateStats orig, CharacterBody self)
			{
				AddNextCrit(self);
				orig.Invoke(self);
			};
			<>c.<>9__14_2 = val2;
			obj2 = (object)val2;
		}
		CharacterBody.RecalculateStats += (hook_RecalculateStats)obj2;
	}

	private static void ProwlerCleanse(DamageReport report)
	{
		if (Utils.DamageReportNullCheck(report))
		{
			return;
		}
		int itemCount = report.attackerBody.inventory.GetItemCount(ProwlerDef);
		if (itemCount > 0 && report.victimBody.isElite)
		{
			if (Util.CheckRoll((float)(BasePercentage + (itemCount - 1) * ScalingPercentage), report.attackerBody.master))
			{
				Util.CleanseBody(report.attackerBody, true, false, true, true, true, false);
				report.attackerBody.AddBuff(Buffs.ElementalRingsReady);
			}
			report.attackerBody.AddBuff(NextCrit);
		}
	}

	private static void RemoveNextCrit(DamageReport report)
	{
		if (!Utils.DamageReportNullCheck(report) && report.attackerBody.HasBuff(NextCrit))
		{
			report.attackerBody.RemoveBuff(NextCrit);
		}
	}

	private static void AddNextCrit(CharacterBody body)
	{
		if (body.HasBuff(NextCrit))
		{
			body.crit += 100f;
		}
	}
}
internal class ShieldBow
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_OnBodyDamaged <>9__20_0;

		public static hook_RecalculateStats <>9__20_1;

		internal void <Hooks>b__20_0(orig_OnBodyDamaged orig, CharacterMaster self, DamageReport report)
		{
			LifeLine(report);
			LifeStealBuff(report);
			orig.Invoke(self, report);
		}

		internal void <Hooks>b__20_1(orig_RecalculateStats orig, CharacterBody self)
		{
			ArmorBuff(self);
			orig.Invoke(self);
		}
	}

	internal static AssetBundle Bundle;

	public static ConfigFile Config;

	private static ItemDef ShieldBowDef;

	private static BuffDef ShieldBuff;

	private static BuffDef LifeVamp;

	private static readonly int BaseLifeStealDurationSecs = 5;

	private static readonly int ScalingLifeStealDurationSecs = 5;

	private static readonly int BaseArmor = 100;

	private static readonly int CooldownSecs = 20;

	private static readonly float TriggerFraction = 0.4f;

	private static readonly float BarrierFraction = 0.4f;

	private static readonly float LifeStealDamageFraction = 0.2f;

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

	internal static void Init()
	{
		Config = NewtDrop.NewtConfig;
		Bundle = NewtDrop.bundle;
		CreateConfig();
		if (ShieldBowConfig.Value)
		{
			CreateItem();
			CreateBuffs();
			Hooks();
		}
	}

	private static void CreateConfig()
	{
		ShieldBowConfig = Config.Bind<bool>("Items", "ShieldBow", true, "Enable this item?");
	}

	private static void CreateItem()
	{
		//IL_005d: 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_00b5: Expected O, but got Unknown
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: Expected O, but got Unknown
		ShieldBowDef = ScriptableObject.CreateInstance<ItemDef>();
		((Object)ShieldBowDef).name = "ShieldBow";
		ShieldBowDef.nameToken = "SB";
		ShieldBowDef.descriptionToken = "SB_Desc";
		ShieldBowDef.loreToken = "SB_Lore";
		ShieldBowDef.pickupToken = "SB_Pickup";
		ShieldBowDef.deprecatedTier = (ItemTier)2;
		ShieldBowDef.pickupIconSprite = Bundle.LoadAsset<Sprite>("Assets/ShieldBow.png");
		ShieldBowDef.pickupModelPrefab = Resources.Load<GameObject>("Prefabs/PickupModels/PickupBuckler");
		ShieldBowDef.canRemove = true;
		ShieldBowDef.hidden = false;
		ItemAPI.Add(new CustomItem(ShieldBowDef, new ItemDisplayRuleDict((ItemDisplayRule[])null)));
		LanguageAPI.Add("SB", "ShieldBow");
		LanguageAPI.Add("SB_Pickup", "Gain barrier and lifesteal when health is low");
		LanguageAPI.Add("SB_Desc", $"Whenever you drop below <style=cIsUtility>{TriggerFraction * 100f}%</style> health, gain a shield for <style=cIsUtility>{BarrierFraction * 100f}%</style> of your maximum health and gain <style=cIsUtility>{LifeStealDamageFraction * 100f}%</style> lifesteal for <style=cIsUtility>{BaseLifeStealDurationSecs}s</style> <style=cStack>(+{ScalingLifeStealDurationSecs}s per stack)</style>. ({CooldownSecs}s cooldown)  While on cooldown, gain <style=cIsUtility>{BaseArmor}</style> armor");
		LanguageAPI.Add("SB_Lore", "Yes, this is from League. Note: does not trigger from fall damage");
	}

	private static void CreateBuffs()
	{
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: 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)
		ShieldBuff = ScriptableObject.CreateInstance<BuffDef>();
		((Object)ShieldBuff).name = "ShieldBuff";
		ShieldBuff.buffColor = Color.cyan;
		ShieldBuff.canStack = false;
		ShieldBuff.isDebuff = true;
		ShieldBuff.iconSprite = Resources.Load<Sprite>("Textures/ItemIcons/texBucklerIcon");
		ContentAddition.AddBuffDef(ShieldBuff);
		LifeVamp = ScriptableObject.CreateInstance<BuffDef>();
		((Object)LifeVamp).name = "LifeVamp";
		LifeVamp.buffColor = Color.red;
		LifeVamp.canStack = false;
		LifeVamp.isDebuff = false;
		LifeVamp.iconSprite = Resources.Load<Sprite>("textures/itemicons/texScytheIcon");
		ContentAddition.AddBuffDef(LifeVamp);
	}

	private static void Hooks()
	{
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Expected O, but got Unknown
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0045: Expected O, but got Unknown
		object obj = <>c.<>9__20_0;
		if (obj == null)
		{
			hook_OnBodyDamaged val = delegate(orig_OnBodyDamaged orig, CharacterMaster self, DamageReport report)
			{
				LifeLine(report);
				LifeStealBuff(report);
				orig.Invoke(self, report);
			};
			<>c.<>9__20_0 = val;
			obj = (object)val;
		}
		CharacterMaster.OnBodyDamaged += (hook_OnBodyDamaged)obj;
		object obj2 = <>c.<>9__20_1;
		if (obj2 == null)
		{
			hook_RecalculateStats val2 = delegate(orig_RecalculateStats orig, CharacterBody self)
			{
				ArmorBuff(self);
				orig.Invoke(self);
			};
			<>c.<>9__20_1 = val2;
			obj2 = (object)val2;
		}
		CharacterBody.RecalculateStats += (hook_RecalculateStats)obj2;
	}

	private static void LifeLine(DamageReport report)
	{
		if (!Utils.DamageReportNullCheck(report))
		{
			int itemCount = report.victimBody.inventory.GetItemCount(ShieldBowDef);
			if (itemCount > 0 && report.victimBody.healthComponent.health / report.victimBody.maxHealth <= TriggerFraction && !report.victimBody.HasBuff(ShieldBuff))
			{
				report.victimBody.healthComponent.AddBarrier(BarrierFraction * report.victimBody.maxHealth);
				report.victimBody.AddTimedBuff(LifeVamp, (float)(BaseLifeStealDurationSecs + (itemCount - 1) * ScalingLifeStealDurationSecs));
				report.victimBody.AddTimedBuff(ShieldBuff, (float)CooldownSecs);
				report.victimBody.RecalculateStats();
			}
		}
	}

	private static void LifeStealBuff(DamageReport report)
	{
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		if (!Utils.DamageReportNullCheck(report) && report.attackerBody.HasBuff(LifeVamp))
		{
			report.attackerBody.healthComponent.Heal(report.damageDealt * LifeStealDamageFraction, report.damageInfo.procChainMask, true);
		}
	}

	private static void ArmorBuff(CharacterBody person)
	{
		if (!((Object)(object)person == (Object)null) && person.HasBuff(ShieldBuff))
		{
			person.armor += (float)BaseArmor;
		}
	}
}
internal class PureTonic
{
	internal static AssetBundle Bundle;

	public static ConfigFile Config;

	private static ItemDef PureTonicDef;

	private static readonly int BasePercentage = 60;

	private static readonly int BaseDurationSec = 3;

	private static readonly int ScalingPercentage = 40;

	private static readonly int ScalingDurationSec = 3;

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

	internal static void Init()
	{
		Config = NewtDrop.NewtConfig;
		Bundle = NewtDrop.bundle;
		CreateConfig();
		if (PureTonicConfig.Value)
		{
			CreateItem();
			Hooks();
		}
	}

	private static void CreateConfig()
	{
		PureTonicConfig = Config.Bind<bool>("Items", "Purified Tonic", true, "Enable this item?");
	}

	private static void CreateItem()
	{
		//IL_005d: 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_00b5: Expected O, but got Unknown
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: Expected O, but got Unknown
		PureTonicDef = ScriptableObject.CreateInstance<ItemDef>();
		((Object)PureTonicDef).name = "PureTonic";
		PureTonicDef.nameToken = "PureTonic";
		PureTonicDef.descriptionToken = "PureTonic_Desc";
		PureTonicDef.loreToken = "PureTonic_Lore";
		PureTonicDef.pickupToken = "PureTonic_Pickup";
		PureTonicDef.deprecatedTier = (ItemTier)2;
		PureTonicDef.pickupIconSprite = Bundle.LoadAsset<Sprite>("Assets/PureTonic.png");
		PureTonicDef.pickupModelPrefab = Resources.Load<GameObject>("Prefabs/PickupModels/PickupTonic");
		PureTonicDef.canRemove = true;
		PureTonicDef.hidden = false;
		ItemAPI.Add(new CustomItem(PureTonicDef, new ItemDisplayRuleDict((ItemDisplayRule[])null)));
		LanguageAPI.Add("PureTonic", "Purified Tonic");
		LanguageAPI.Add("PureTonic_Pickup", "Chance to use tonic on kill without getting debuffed");
		LanguageAPI.Add("PureTonic_Desc", $"Whenever you <style=cIsDamage>kill an enemy</style>, you have a <style=cIsUtility>{BasePercentage}%</style> <style=cStack>(+{ScalingPercentage}% per stack)</style> chance to use tonic without chance of debuff for <style=cIsUtility>{BaseDurationSec}s</style> <style=cStack>(+{ScalingDurationSec}s per stack)</style>.");
		LanguageAPI.Add("PureTonic_Lore", "Harder, better, faster, stronger");
	}

	private static void Hooks()
	{
		GlobalEventManager.onCharacterDeathGlobal += delegate(DamageReport report)
		{
			GiveTonic(report);
		};
	}

	private static void GiveTonic(DamageReport report)
	{
		if (!Utils.DamageReportNullCheck(report))
		{
			int itemCount = report.attackerBody.inventory.GetItemCount(PureTonicDef);
			if (itemCount > 0 && Util.CheckRoll((float)(BasePercentage + (itemCount - 1) * ScalingPercentage), report.attackerBody.master))
			{
				report.attackerBody.AddTimedBuff(Buffs.TonicBuff, (float)(BaseDurationSec + (itemCount - 1) * ScalingDurationSec));
			}
		}
	}
}
internal class Utils
{
	public static bool DamageReportNullCheck(DamageReport report)
	{
		return report == null || (Object)(object)report.attacker == (Object)null || !Object.op_Implicit((Object)(object)report.attacker) || !Object.op_Implicit((Object)(object)report.attackerBody) || !Object.op_Implicit((Object)(object)report.attackerBody.inventory) || (Object)(object)report.victim == (Object)null || !Object.op_Implicit((Object)(object)report.victimBody) || !Object.op_Implicit((Object)(object)report.victimBody.inventory);
	}
}
internal class ShopKeeperTweak
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_Start <>9__8_0;

		public static hook_Start <>9__8_1;

		public static Action<DamageReport> <>9__8_2;

		internal void <Hooks>b__8_0(orig_Start orig, Run self)
		{
			gotDrop = false;
			orig.Invoke(self);
		}

		internal void <Hooks>b__8_1(orig_Start orig, CharacterBody self)
		{
			ChangeNewtHealth(self);
			orig.Invoke(self);
		}

		internal void <Hooks>b__8_2(DamageReport report)
		{
			SpawnPearls(report);
		}
	}

	public static ConfigFile Config;

	private static bool gotDrop;

	public static ConfigEntry<float> NewtHealthMultiplier { get; set; }

	internal static void Init()
	{
		gotDrop = false;
		Config = NewtDrop.NewtConfig;
		CreateConfig();
		Hooks();
	}

	private static void CreateConfig()
	{
		NewtHealthMultiplier = Config.Bind<float>("Tweak", "Newt Health Multiplier", 1f, "Multiplier for the Shopkeeper's max health. Default: 1");
	}

	private static void Hooks()
	{
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Expected O, but got Unknown
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0045: Expected O, but got Unknown
		object obj = <>c.<>9__8_0;
		if (obj == null)
		{
			hook_Start val = delegate(orig_Start orig, Run self)
			{
				gotDrop = false;
				orig.Invoke(self);
			};
			<>c.<>9__8_0 = val;
			obj = (object)val;
		}
		Run.Start += (hook_Start)obj;
		object obj2 = <>c.<>9__8_1;
		if (obj2 == null)
		{
			hook_Start val2 = delegate(orig_Start orig, CharacterBody self)
			{
				ChangeNewtHealth(self);
				orig.Invoke(self);
			};
			<>c.<>9__8_1 = val2;
			obj2 = (object)val2;
		}
		CharacterBody.Start += (hook_Start)obj2;
		GlobalEventManager.onCharacterDeathGlobal += delegate(DamageReport report)
		{
			SpawnPearls(report);
		};
	}

	private static void ChangeNewtHealth(CharacterBody person)
	{
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		if (NewtHealthMultiplier.Value != 1f && person.bodyIndex == BodyCatalog.FindBodyIndex("ShopkeeperBody"))
		{
			HealthComponent healthComponent = person.healthComponent;
			healthComponent.health *= NewtHealthMultiplier.Value;
			person.baseMaxHealth *= NewtHealthMultiplier.Value;
			person.levelMaxHealth *= NewtHealthMultiplier.Value;
			person.maxHealth *= NewtHealthMultiplier.Value;
			person.RecalculateStats();
		}
	}

	private static void SpawnPearls(DamageReport report)
	{
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: Unknown result type (might be due to invalid IL or missing references)
		//IL_006d: 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_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_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)
		//IL_0059: Unknown result type (might be due to invalid IL or missing references)
		CharacterBody victimBody = report.victimBody;
		if ((Object)(object)victimBody != (Object)null && victimBody.bodyIndex == BodyCatalog.FindBodyIndex("ShopkeeperBody"))
		{
			if (gotDrop)
			{
				PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(Items.Pearl.itemIndex), victimBody.transform.position, Vector3.up * 20f);
				return;
			}
			PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(Items.ShinyPearl.itemIndex), victimBody.transform.position, Vector3.up * 20f);
			gotDrop = true;
		}
	}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.BoneCap.NewtDrop", "NewtDrop", "2.0.0")]
[R2APISubmoduleDependency(new string[] { "ItemAPI", "LanguageAPI" })]
public class NewtDrop : BaseUnityPlugin
{
	public static ManualLogSource Log;

	public GameObject multiShopPrefab;

	public ItemTier[] itemTiers;

	internal static AssetBundle bundle;

	public static ConfigFile NewtConfig { get; set; }

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

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

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

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

	public static ConfigEntry<float> NewtHealthMultiplier { get; set; }

	public void Awake()
	{
		Log = ((BaseUnityPlugin)this).Logger;
		NewtConfig = ((BaseUnityPlugin)this).Config;
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("NewtDrop.newt_drop_assets"))
		{
			bundle = AssetBundle.LoadFromStream(stream);
			bundle.LoadAllAssets();
		}
		ShopKeeperTweak.Init();
		CeremonialFireworks.Init();
		PureTonic.Init();
		ShieldBow.Init();
		Prowler.Init();
	}
}