Decompiled source of ZetItemTweaks v1.2.3

ZetItemTweaks.dll

Decompiled 4 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using EntityStates.CaptainDefenseMatrixItem;
using EntityStates.TeleporterHealNovaController;
using IL.EntityStates.CaptainDefenseMatrixItem;
using IL.EntityStates.TeleporterHealNovaController;
using IL.RoR2;
using IL.RoR2.Items;
using Mono.Cecil;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using MonoMod.RuntimeDetour;
using On.EntityStates.TeleporterHealNovaController;
using On.RoR2;
using On.RoR2.Items;
using On.RoR2.Skills;
using RoR2;
using RoR2.ContentManagement;
using RoR2.Items;
using RoR2.Orbs;
using RoR2.Skills;
using RoR2.UI;
using TMPro;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("ZetItemTweaks")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ZetItemTweaks")]
[assembly: AssemblyTitle("ZetItemTweaks")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace TPDespair.ZetItemTweaks;

public static class Aegis
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static Func<Instruction, bool> <>9__41_1;

		public static Func<Instruction, bool> <>9__41_2;

		public static Func<Instruction, bool> <>9__41_3;

		public static Func<Instruction, bool> <>9__41_4;

		public static Func<Instruction, bool> <>9__41_5;

		public static Func<HealthComponent, float> <>9__41_6;

		public static Manipulator <>9__41_0;

		internal void <OverhealHook>b__41_0(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			if (val.TryGotoNext(new Func<Instruction, bool>[5]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdflda(x, "RoR2.HealthComponent", "itemCounts"),
				(Instruction x) => ILPatternMatchingExt.MatchLdfld(x, "RoR2.HealthComponent/ItemCounts", "barrierOnOverHeal"),
				(Instruction x) => ILPatternMatchingExt.MatchConvR4(x),
				(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 0.5f),
				(Instruction x) => ILPatternMatchingExt.MatchMul(x)
			}))
			{
				val.Index += 5;
				val.Emit(OpCodes.Pop);
				val.Emit(OpCodes.Ldarg, 0);
				val.EmitDelegate<Func<HealthComponent, float>>((Func<HealthComponent, float>)delegate(HealthComponent healthComponent)
				{
					int barrierOnOverHeal = healthComponent.itemCounts.barrierOnOverHeal;
					return BaseOverheal.Value + StackOverheal.Value * (float)(barrierOnOverHeal - 1);
				});
			}
			else
			{
				ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: OverhealHook Failed!");
			}
		}

		internal bool <OverhealHook>b__41_1(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdflda(x, "RoR2.HealthComponent", "itemCounts");
		}

		internal bool <OverhealHook>b__41_2(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdfld(x, "RoR2.HealthComponent/ItemCounts", "barrierOnOverHeal");
		}

		internal bool <OverhealHook>b__41_3(Instruction x)
		{
			return ILPatternMatchingExt.MatchConvR4(x);
		}

		internal bool <OverhealHook>b__41_4(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdcR4(x, 0.5f);
		}

		internal bool <OverhealHook>b__41_5(Instruction x)
		{
			return ILPatternMatchingExt.MatchMul(x);
		}

		internal float <OverhealHook>b__41_6(HealthComponent healthComponent)
		{
			int barrierOnOverHeal = healthComponent.itemCounts.barrierOnOverHeal;
			return BaseOverheal.Value + StackOverheal.Value * (float)(barrierOnOverHeal - 1);
		}
	}

	internal static BuffDef BarrierBuff;

	public static List<string> autoCompatList = new List<string> { "com.kking117.FlatItemBuff", "com.Ben.BenBalanceMod" };

	public static string itemIdentifier = "Aegis";

	public static bool appliedChanges = false;

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

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

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

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

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

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

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

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

	internal static void Init()
	{
		SetupConfig();
		if (EnableChanges.Value > 0)
		{
			ZetItemTweaksPlugin.OnLateSetup = (Action)Delegate.Combine(ZetItemTweaksPlugin.OnLateSetup, new Action(LateSetup));
		}
	}

	private static void SetupConfig()
	{
		EnableChanges = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "EnableChanges", 1, ZetItemTweaksPlugin.SectionEnableDesc);
		if (ZetItemTweaksPlugin.GenerateOverrideText.Value)
		{
			OverrideText = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "OverrideText", defaultValue: true, "Replace item description text.");
		}
		BaseOverheal = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseOverheal", 0.5f, "Overheal barrier gained from item.");
		StackOverheal = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackOverheal", 0.5f, "Overheal barrier gained from item per stack.");
		BaseArmor = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseArmor", 30f, "Armor gained from item.");
		StackArmor = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackArmor", 15f, "Armor gained from item per stack.");
		BaseBarrierArmor = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseBarrierArmor", 0f, "Armor gained while barrier is active from item.");
		StackBarrierArmor = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackBarrierArmor", 0f, "Armor gained while barrier is active from item per stack.");
	}

	private static void LateSetup()
	{
		if (ZetItemTweaksPlugin.ProceedChanges(itemIdentifier, EnableChanges.Value, autoCompatList))
		{
			CharacterBody.onBodyInventoryChangedGlobal += HandleItemBehavior;
			OverhealHook();
			if (!ZetItemTweaksPlugin.GenerateOverrideText.Value || OverrideText.Value)
			{
				ZetItemTweaksPlugin.targetLanguage = "default";
				ZetItemTweaksPlugin.RegisterFragment("OVERHEAL_BARRIER", "Excess healing generates <style=cIsHealing>barrier</style> for {0} of the amount you <style=cIsHealing>healed</style>.");
				ZetItemTweaksPlugin.RegisterFragment("BARRIER_ARMOR", "\nIncreases <style=cIsHealing>armor</style> by {0} while <style=cIsHealing>barrier</style> is active.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_BARRIERONOVERHEAL_DESC", DescriptionText());
				ZetItemTweaksPlugin.targetLanguage = "pt-BR";
				ZetItemTweaksPlugin.RegisterFragment("OVERHEAL_BARRIER", "O excesso de cura gera uma <style=cIsHealing>barreira</style> em {0} do valor que você <style=cIsHealing>curou</style>.");
				ZetItemTweaksPlugin.RegisterFragment("BARRIER_ARMOR", "\nAumenta a <style=cIsHealing>armadura</style> em {0} enquanto a <style=cIsHealing>barreira</style> estiver ativa.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_BARRIERONOVERHEAL_DESC", DescriptionText());
				ZetItemTweaksPlugin.targetLanguage = "";
			}
			appliedChanges = true;
		}
	}

	private static string DescriptionText()
	{
		string text = string.Format(ZetItemTweaksPlugin.TextFragment("OVERHEAL_BARRIER"), ZetItemTweaksPlugin.ScalingText(BaseOverheal.Value, StackOverheal.Value, "percent", "cIsHealing"));
		if (BaseArmor.Value > 0f)
		{
			text += string.Format(ZetItemTweaksPlugin.TextFragment("STAT_ARMOR"), ZetItemTweaksPlugin.ScalingText(BaseArmor.Value, StackArmor.Value, "flat", "cIsHealing"));
		}
		if (BaseBarrierArmor.Value > 0f)
		{
			text += string.Format(ZetItemTweaksPlugin.TextFragment("BARRIER_ARMOR"), ZetItemTweaksPlugin.ScalingText(BaseBarrierArmor.Value, StackBarrierArmor.Value, "flat", "cIsHealing"));
		}
		return text;
	}

	private static void HandleItemBehavior(CharacterBody body)
	{
		if (NetworkServer.active)
		{
			body.AddItemBehavior<BarrierArmorBehavior>(body.inventory.GetItemCount(Items.BarrierOnOverHeal));
		}
	}

	private static void OverhealHook()
	{
		//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
		object obj = <>c.<>9__41_0;
		if (obj == null)
		{
			Manipulator val = delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
				ILCursor val2 = new ILCursor(il);
				if (val2.TryGotoNext(new Func<Instruction, bool>[5]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdflda(x, "RoR2.HealthComponent", "itemCounts"),
					(Instruction x) => ILPatternMatchingExt.MatchLdfld(x, "RoR2.HealthComponent/ItemCounts", "barrierOnOverHeal"),
					(Instruction x) => ILPatternMatchingExt.MatchConvR4(x),
					(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 0.5f),
					(Instruction x) => ILPatternMatchingExt.MatchMul(x)
				}))
				{
					val2.Index += 5;
					val2.Emit(OpCodes.Pop);
					val2.Emit(OpCodes.Ldarg, 0);
					val2.EmitDelegate<Func<HealthComponent, float>>((Func<HealthComponent, float>)delegate(HealthComponent healthComponent)
					{
						int barrierOnOverHeal = healthComponent.itemCounts.barrierOnOverHeal;
						return BaseOverheal.Value + StackOverheal.Value * (float)(barrierOnOverHeal - 1);
					});
				}
				else
				{
					ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: OverhealHook Failed!");
				}
			};
			<>c.<>9__41_0 = val;
			obj = (object)val;
		}
		HealthComponent.Heal += (Manipulator)obj;
	}
}
public class BarrierArmorBehavior : ItemBehavior
{
	private HealthComponent healthComponent;

	private int buffActive = 0;

	public void Awake()
	{
		((Behaviour)this).enabled = false;
	}

	public void OnEnable()
	{
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		if (Object.op_Implicit((Object)(object)base.body))
		{
			healthComponent = ((Component)base.body).GetComponent<HealthComponent>();
			buffActive = 0;
			base.body.SetBuffCount(Aegis.BarrierBuff.buffIndex, 0);
		}
	}

	public void OnDisable()
	{
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		if (Object.op_Implicit((Object)(object)base.body))
		{
			buffActive = 0;
			base.body.SetBuffCount(Aegis.BarrierBuff.buffIndex, 0);
		}
		healthComponent = null;
	}

	public void FixedUpdate()
	{
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		if (Object.op_Implicit((Object)(object)base.body))
		{
			int num = ((Object.op_Implicit((Object)(object)healthComponent) && healthComponent.barrier > 0f) ? 1 : 0);
			if (buffActive != num)
			{
				buffActive = num;
				base.body.SetBuffCount(Aegis.BarrierBuff.buffIndex, num);
			}
		}
	}
}
public static class AlienHead
{
	internal static Sprite PickupIcon;

	public static List<string> autoCompatList = new List<string> { "com.Borbo.GreenAlienHead" };

	public static string itemIdentifier = "AlienHead";

	public static bool appliedChanges = false;

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

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

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

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

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

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

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

	internal static void Init()
	{
		SetupConfig();
		if (EnableChanges.Value > 0)
		{
			ZetItemTweaksPlugin.OnItemCatalogPreInit = (Action)Delegate.Combine(ZetItemTweaksPlugin.OnItemCatalogPreInit, new Action(ModifyItem));
			ZetItemTweaksPlugin.OnLateSetup = (Action)Delegate.Combine(ZetItemTweaksPlugin.OnLateSetup, new Action(LateSetup));
		}
	}

	private static void SetupConfig()
	{
		EnableChanges = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "EnableChanges", 1, ZetItemTweaksPlugin.SectionEnableDesc);
		if (ZetItemTweaksPlugin.GenerateOverrideText.Value)
		{
			OverrideText = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "OverrideText", defaultValue: true, "Replace item description text.");
		}
		BaseCooldown = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseCooldown", 0.1f, "Cooldown reduction gained from item.");
		StackCooldown = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackCooldown", 0.1f, "Cooldown reduction gained from item per stack.");
		BaseFlatCooldown = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseFlatCooldown", 0f, "Cooldown deduction gained from item.");
		StackFlatCooldown = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackFlatCooldown", 0f, "Cooldown deduction gained from item per stack.");
		GreenTier = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "GreenTier", defaultValue: true, "Change item to green tier.");
	}

	private static void ModifyItem()
	{
		if (!ZetItemTweaksPlugin.ProceedChanges(itemIdentifier, EnableChanges.Value, autoCompatList, ZetItemTweaksPlugin.Feedback.LogAll))
		{
			return;
		}
		bool flag = false;
		ItemDef alienHead = Items.AlienHead;
		if (GreenTier.Value)
		{
			alienHead._itemTierDef = LegacyResourcesAPI.Load<ItemTierDef>("ItemTierDefs/Tier2Def");
			if (Object.op_Implicit((Object)(object)PickupIcon))
			{
				alienHead.pickupIconSprite = PickupIcon;
			}
			flag = true;
		}
		if (flag)
		{
			ZetItemTweaksPlugin.ModifiedItemDefCount++;
		}
	}

	private static void LateSetup()
	{
		if (ZetItemTweaksPlugin.ProceedChanges(itemIdentifier, EnableChanges.Value, autoCompatList))
		{
			if (!ZetItemTweaksPlugin.GenerateOverrideText.Value || OverrideText.Value)
			{
				ZetItemTweaksPlugin.targetLanguage = "default";
				ZetItemTweaksPlugin.RegisterFragment("COOLDOWN_DEDUCT", "\nReduces <style=cIsUtility>skill cooldowns</style> by {0} seconds.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_ALIENHEAD_DESC", DescriptionText());
				ZetItemTweaksPlugin.targetLanguage = "pt-BR";
				ZetItemTweaksPlugin.RegisterFragment("COOLDOWN_DEDUCT", "\nReduz as <style=cIsUtility>recargas de habilidades</style> em {0} segundos.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_ALIENHEAD_DESC", DescriptionText());
				ZetItemTweaksPlugin.targetLanguage = "";
			}
			appliedChanges = true;
		}
	}

	private static string DescriptionText()
	{
		string text = "";
		if (BaseCooldown.Value > 0f)
		{
			text += string.Format(ZetItemTweaksPlugin.TextFragment("STAT_COOLDOWN", trim: true), ZetItemTweaksPlugin.ScalingText(BaseCooldown.Value, StackCooldown.Value, "percent", "cIsUtility"));
		}
		if (BaseFlatCooldown.Value > 0f)
		{
			if (text != "")
			{
				text += "\n";
			}
			text += string.Format(ZetItemTweaksPlugin.TextFragment("COOLDOWN_DEDUCT", trim: true), ZetItemTweaksPlugin.ScalingText(BaseFlatCooldown.Value, StackFlatCooldown.Value, "flat", "cIsUtility"));
		}
		return text;
	}
}
public static class AtgMissileMk1
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static Func<Instruction, bool> <>9__29_1;

		public static Func<Instruction, bool> <>9__29_2;

		public static Func<Instruction, bool> <>9__29_3;

		public static Manipulator <>9__29_0;

		public static Func<Instruction, bool> <>9__30_1;

		public static Func<Instruction, bool> <>9__30_2;

		public static Func<Instruction, bool> <>9__30_3;

		public static Func<Instruction, bool> <>9__30_4;

		public static Func<float> <>9__30_5;

		public static Manipulator <>9__30_0;

		public static Func<Instruction, bool> <>9__31_1;

		public static Func<Instruction, bool> <>9__31_2;

		public static Func<Instruction, bool> <>9__31_3;

		public static Func<Instruction, bool> <>9__31_4;

		public static Func<int, float> <>9__31_5;

		public static Manipulator <>9__31_0;

		internal void <FindIndexHook>b__29_0(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			ILCursor val = new ILCursor(il);
			if (val.TryGotoNext(new Func<Instruction, bool>[3]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Items).GetField("Missile")),
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Inventory>(x, "GetItemCount"),
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref ItemCountLocIndex)
			}))
			{
				StlocCursorIndex = val.Index;
			}
			else
			{
				ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: FindIndexHook Failed!");
			}
		}

		internal bool <FindIndexHook>b__29_1(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdsfld(x, typeof(Items).GetField("Missile"));
		}

		internal bool <FindIndexHook>b__29_2(Instruction x)
		{
			return ILPatternMatchingExt.MatchCallOrCallvirt<Inventory>(x, "GetItemCount");
		}

		internal bool <FindIndexHook>b__29_3(Instruction x)
		{
			return ILPatternMatchingExt.MatchStloc(x, ref ItemCountLocIndex);
		}

		internal void <ProcChanceHook>b__30_0(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.Index = StlocCursorIndex;
			if (val.TryGotoNext(new Func<Instruction, bool>[4]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 10f),
				(Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 1),
				(Instruction x) => ILPatternMatchingExt.MatchLdfld<DamageInfo>(x, "procCoefficient"),
				(Instruction x) => ILPatternMatchingExt.MatchMul(x)
			}))
			{
				val.Index += 1;
				val.Emit(OpCodes.Pop);
				val.EmitDelegate<Func<float>>((Func<float>)(() => ProcChance.Value));
			}
			else
			{
				ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: ProcChanceHook Failed!");
			}
		}

		internal bool <ProcChanceHook>b__30_1(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdcR4(x, 10f);
		}

		internal bool <ProcChanceHook>b__30_2(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdarg(x, 1);
		}

		internal bool <ProcChanceHook>b__30_3(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdfld<DamageInfo>(x, "procCoefficient");
		}

		internal bool <ProcChanceHook>b__30_4(Instruction x)
		{
			return ILPatternMatchingExt.MatchMul(x);
		}

		internal float <ProcChanceHook>b__30_5()
		{
			return ProcChance.Value;
		}

		internal void <DamageHook>b__31_0(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.Index = StlocCursorIndex;
			int num = default(int);
			if (val.TryGotoNext(new Func<Instruction, bool>[4]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ItemCountLocIndex),
				(Instruction x) => ILPatternMatchingExt.MatchConvR4(x),
				(Instruction x) => ILPatternMatchingExt.MatchMul(x),
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref num)
			}))
			{
				val.Index += 3;
				val.Emit(OpCodes.Pop);
				val.Emit(OpCodes.Ldloc, ItemCountLocIndex);
				val.EmitDelegate<Func<int, float>>((Func<int, float>)((int count) => BaseDamage.Value + StackDamage.Value * (float)(count - 1)));
			}
			else
			{
				ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: DamageHook Failed!");
			}
		}

		internal bool <DamageHook>b__31_1(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdloc(x, ItemCountLocIndex);
		}

		internal bool <DamageHook>b__31_2(Instruction x)
		{
			return ILPatternMatchingExt.MatchConvR4(x);
		}

		internal bool <DamageHook>b__31_3(Instruction x)
		{
			return ILPatternMatchingExt.MatchMul(x);
		}

		internal bool <DamageHook>b__31_4(Instruction x)
		{
			int num = default(int);
			return ILPatternMatchingExt.MatchStloc(x, ref num);
		}

		internal float <DamageHook>b__31_5(int count)
		{
			return BaseDamage.Value + StackDamage.Value * (float)(count - 1);
		}
	}

	public static List<string> autoCompatList = new List<string> { "com.RiskyLives.RiskyMod" };

	public static string itemIdentifier = "AtgMissileMk1";

	public static bool appliedChanges = false;

	private static int ItemCountLocIndex = 0;

	private static int StlocCursorIndex = 0;

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

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

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

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

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

	internal static void Init()
	{
		SetupConfig();
		if (EnableChanges.Value > 0)
		{
			ZetItemTweaksPlugin.OnLateSetup = (Action)Delegate.Combine(ZetItemTweaksPlugin.OnLateSetup, new Action(LateSetup));
		}
	}

	private static void SetupConfig()
	{
		EnableChanges = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "EnableChanges", 1, ZetItemTweaksPlugin.SectionEnableDesc);
		if (ZetItemTweaksPlugin.GenerateOverrideText.Value)
		{
			OverrideText = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "OverrideText", defaultValue: true, "Replace item description text.");
		}
		ProcChance = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "ProcChance", 10f, "Chance to proc item effect. 10 = 10%");
		BaseDamage = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseDamage", 3f, "Missile damage gained from item.");
		StackDamage = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackDamage", 2f, "Missile damage gained from item per stack.");
	}

	private static void LateSetup()
	{
		if (!ZetItemTweaksPlugin.ProceedChanges(itemIdentifier, EnableChanges.Value, autoCompatList))
		{
			return;
		}
		FindIndexHook();
		if (ItemCountLocIndex != 0)
		{
			ProcChanceHook();
			DamageHook();
			if (!ZetItemTweaksPlugin.GenerateOverrideText.Value || OverrideText.Value)
			{
				ZetItemTweaksPlugin.targetLanguage = "default";
				ZetItemTweaksPlugin.RegisterFragment("ATG_MISSILE", "{0} chance to fire a <style=cIsDamage>missile</style> that deals {1} TOTAL damage.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_MISSILE_DESC", DescriptionText());
				ZetItemTweaksPlugin.targetLanguage = "pt-BR";
				ZetItemTweaksPlugin.RegisterFragment("ATG_MISSILE", "{0} de chance de disparar um <style=cIsDamage>míssil</style> que causa {1} de dano TOTAL.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_MISSILE_DESC", DescriptionText());
				ZetItemTweaksPlugin.targetLanguage = "";
			}
			appliedChanges = true;
		}
		else
		{
			ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: LateSetup Failed!");
		}
	}

	private static string DescriptionText()
	{
		return string.Format(ZetItemTweaksPlugin.TextFragment("ATG_MISSILE"), ZetItemTweaksPlugin.ScalingText(ProcChance.Value, "chance", "cIsDamage"), ZetItemTweaksPlugin.ScalingText(BaseDamage.Value, StackDamage.Value, "percent", "cIsDamage"));
	}

	private static void FindIndexHook()
	{
		//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
		object obj = <>c.<>9__29_0;
		if (obj == null)
		{
			Manipulator val = delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				ILCursor val2 = new ILCursor(il);
				if (val2.TryGotoNext(new Func<Instruction, bool>[3]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Items).GetField("Missile")),
					(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Inventory>(x, "GetItemCount"),
					(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref ItemCountLocIndex)
				}))
				{
					StlocCursorIndex = val2.Index;
				}
				else
				{
					ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: FindIndexHook Failed!");
				}
			};
			<>c.<>9__29_0 = val;
			obj = (object)val;
		}
		GlobalEventManager.OnHitEnemy += (Manipulator)obj;
	}

	private static void ProcChanceHook()
	{
		//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
		object obj = <>c.<>9__30_0;
		if (obj == null)
		{
			Manipulator val = delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
				ILCursor val2 = new ILCursor(il);
				val2.Index = StlocCursorIndex;
				if (val2.TryGotoNext(new Func<Instruction, bool>[4]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 10f),
					(Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 1),
					(Instruction x) => ILPatternMatchingExt.MatchLdfld<DamageInfo>(x, "procCoefficient"),
					(Instruction x) => ILPatternMatchingExt.MatchMul(x)
				}))
				{
					val2.Index += 1;
					val2.Emit(OpCodes.Pop);
					val2.EmitDelegate<Func<float>>((Func<float>)(() => ProcChance.Value));
				}
				else
				{
					ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: ProcChanceHook Failed!");
				}
			};
			<>c.<>9__30_0 = val;
			obj = (object)val;
		}
		GlobalEventManager.OnHitEnemy += (Manipulator)obj;
	}

	private static void DamageHook()
	{
		//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
		object obj = <>c.<>9__31_0;
		if (obj == null)
		{
			Manipulator val = delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
				ILCursor val2 = new ILCursor(il);
				val2.Index = StlocCursorIndex;
				int num = default(int);
				if (val2.TryGotoNext(new Func<Instruction, bool>[4]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ItemCountLocIndex),
					(Instruction x) => ILPatternMatchingExt.MatchConvR4(x),
					(Instruction x) => ILPatternMatchingExt.MatchMul(x),
					(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref num)
				}))
				{
					val2.Index += 3;
					val2.Emit(OpCodes.Pop);
					val2.Emit(OpCodes.Ldloc, ItemCountLocIndex);
					val2.EmitDelegate<Func<int, float>>((Func<int, float>)((int count) => BaseDamage.Value + StackDamage.Value * (float)(count - 1)));
				}
				else
				{
					ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: DamageHook Failed!");
				}
			};
			<>c.<>9__31_0 = val;
			obj = (object)val;
		}
		GlobalEventManager.OnHitEnemy += (Manipulator)obj;
	}
}
public static class BensRainCoat
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_RecalculateStats <>9__82_0;

		public static hook_OnEnable <>9__84_0;

		public static hook_OnDisable <>9__84_1;

		public static hook_FixedUpdate <>9__84_2;

		public static hook_TryApplyOverride <>9__85_0;

		public static hook_CleanseBody <>9__86_0;

		internal void <AttachTrackerHook>b__82_0(orig_RecalculateStats orig, CharacterBody self)
		{
			orig.Invoke(self);
			if (NetworkServer.active && Object.op_Implicit((Object)(object)self))
			{
				UpdateImmunityTracker(self);
			}
		}

		internal void <DisableDefaultHook>b__84_0(orig_OnEnable orig, ImmuneToDebuffBehavior self)
		{
		}

		internal void <DisableDefaultHook>b__84_1(orig_OnDisable orig, ImmuneToDebuffBehavior self)
		{
		}

		internal void <DisableDefaultHook>b__84_2(orig_FixedUpdate orig, ImmuneToDebuffBehavior self)
		{
		}

		internal bool <TryApplyOverrideHook>b__85_0(orig_TryApplyOverride orig, CharacterBody body)
		{
			ImmunityTracker component = ((Component)body).GetComponent<ImmunityTracker>();
			if (Object.op_Implicit((Object)(object)component))
			{
				if (component.isProtected)
				{
					return true;
				}
				if (component.canProtect)
				{
					component.TriggerProtection();
					return true;
				}
			}
			return false;
		}

		internal void <HandleCleanseHook>b__86_0(orig_CleanseBody orig, CharacterBody body, bool debuff, bool buff, bool cooldown, bool dot, bool stun, bool proj)
		{
			if (Object.op_Implicit((Object)(object)body) && cooldown)
			{
				ImmunityTracker component = ((Component)body).GetComponent<ImmunityTracker>();
				if (Object.op_Implicit((Object)(object)component))
				{
					component.CleanseCooldown();
				}
			}
			orig.Invoke(body, debuff, buff, cooldown, dot, stun, proj);
		}
	}

	public static GameObject ImmunityEffectPrefab;

	public static List<string> autoCompatList = new List<string> { "com.kking117.FlatItemBuff", "PhysicsFox.BetterBensRaincoat", "ImBonkers.OGRaincoat", "prototype.raincoat" };

	public static string itemIdentifier = "BensRainCoat";

	public static bool appliedChanges = false;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	internal static void Init()
	{
		SetupConfig();
		if (EnableChanges.Value > 0)
		{
			ZetItemTweaksPlugin.OnItemCatalogPreInit = (Action)Delegate.Combine(ZetItemTweaksPlugin.OnItemCatalogPreInit, new Action(ModifyItem));
			ZetItemTweaksPlugin.OnLateSetup = (Action)Delegate.Combine(ZetItemTweaksPlugin.OnLateSetup, new Action(LateSetup));
		}
	}

	private static void SetupConfig()
	{
		EnableChanges = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "EnableChanges", 1, ZetItemTweaksPlugin.SectionEnableDesc);
		if (ZetItemTweaksPlugin.GenerateOverrideText.Value)
		{
			OverrideText = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "OverrideText", defaultValue: true, "Replace item description text.");
		}
		BaseImmunity = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseImmunity", 2, "Maximum immunity charges gained from item.");
		StackImmunity = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackImmunity", 1, "Maximum immunity charges gained from item per stack.");
		ImmunityCheat = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "ImmunityCheat", defaultValue: false, "Debuff immunity is always active.");
		ImmunityDuration = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "ImmunityDuration", 0.25f, "Debuff immunity duration when protection is triggered.");
		ImmunityCheatDuration = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "ImmunityCheatDuration", 1f, "Serves as barrier recovery cooldown while cheat enabled.");
		BaseRecharge = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseRecharge", 5f, "Recharge interval for gaining immunity charge.");
		StackReduction = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackReduction", 0.1f, "Recharge interval reduction per stack.");
		BaseHealth = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseHealth", 0f, "Health gained from item.");
		StackHealth = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackHealth", 0f, "Health gained from item per stack.");
		BaseHealthPercent = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseHealthPercent", 0f, "Health percent gained from item.");
		StackHealthPercent = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackHealthPercent", 0f, "Health percent gained from item per stack.");
		BaseBarrierRecovery = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseBarrierRecovery", 0.1f, "Barrier recovery fraction when protection is triggered.");
		StackBarrierRecovery = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackBarrierRecovery", 0f, "Barrier recovery fraction per stack when protection is triggered.");
		BaseSafeRegenFraction = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseSafeRegenFraction", 0f, "Health regeneration fraction gained while safe from item. 0.01 = 1% regeneration.");
		StackSafeRegenFraction = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackSafeRegenFraction", 0f, "Health regeneration fraction gained while safe from item per stack.");
		Blacklist = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "Blacklist", defaultValue: false, "Add AIBlacklist ItemTag to item.");
	}

	private static void ModifyItem()
	{
		if (ZetItemTweaksPlugin.ProceedChanges(itemIdentifier, EnableChanges.Value, autoCompatList, ZetItemTweaksPlugin.Feedback.LogAll))
		{
			bool flag = false;
			ItemDef immuneToDebuff = Items.ImmuneToDebuff;
			if (Blacklist.Value && immuneToDebuff.DoesNotContainTag((ItemTag)4))
			{
				List<ItemTag> list = immuneToDebuff.tags.ToList();
				list.Add((ItemTag)4);
				immuneToDebuff.tags = list.ToArray();
				flag = true;
			}
			if (flag)
			{
				ZetItemTweaksPlugin.ModifiedItemDefCount++;
			}
		}
	}

	private static void LateSetup()
	{
		//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)
		if (ZetItemTweaksPlugin.ProceedChanges(itemIdentifier, EnableChanges.Value, autoCompatList))
		{
			Buffs.ImmuneToDebuffCooldown.canStack = true;
			ImmunityEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/ImmuneToDebuff/ImmuneToDebuffEffect.prefab").WaitForCompletion();
			AttachTrackerHook();
			DisableDefaultHook();
			TryApplyOverrideHook();
			HandleCleanseHook();
			if (!ZetItemTweaksPlugin.GenerateOverrideText.Value || OverrideText.Value)
			{
				ZetItemTweaksPlugin.targetLanguage = "default";
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_CHEAT", "Become immune to <style=cIsDamage>debuffs</style>.");
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_CHEAT_BARRIER", "Prevents <style=cIsDamage>debuffs</style> and instead generates {0} <style=cIsHealing>barrier</style>.");
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_CHARGES", "Maximum of {0} <style=cIsUtility>cleanse</style> charges.");
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_RECHARGE", "\nGain a charge {0}.");
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_RECHARGE_REDUCE", "\nGain a charge {0} <style=cStack>(-{1} per stack)</style>.");
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_PROTECTION", "\nEach charge prevents <style=cIsDamage>debuffs</style> {0}.");
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_PROTECTION_BARRIER", "\nEach charge prevents <style=cIsDamage>debuffs</style> {0} and generates {1} <style=cIsHealing>barrier</style>.");
				ZetItemTweaksPlugin.RegisterFragment("SAFE_REGENERATION", "\nIncreases <style=cIsHealing>health regeneration</style> by {0} while out of danger.");
				ZetItemTweaksPlugin.RegisterFragment("BEN_PICKUP_CHEATBARRIER", "Prevent debuffs, instead gaining a temporary barrier.");
				ZetItemTweaksPlugin.RegisterFragment("BEN_PICKUP_CHEAT", "Become immune to debuffs.");
				ZetItemTweaksPlugin.RegisterFragment("BEN_PICKUP_CHARGEBARRIER", "Prevent debuffs, instead gaining a temporary barrier. Recharges over time.");
				ZetItemTweaksPlugin.RegisterFragment("BEN_PICKUP_CHARGE", "Prevent debuffs. Recharges over time.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_IMMUNETODEBUFF_DESC", DescriptionText());
				ZetItemTweaksPlugin.RegisterToken("ITEM_IMMUNETODEBUFF_PICKUP", PickupText());
				ZetItemTweaksPlugin.targetLanguage = "pt-BR";
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_CHEAT", "Se torne imune a <style=cIsDamage>penalidades</style>.");
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_CHEAT_BARRIER", "Previne <style=cIsDamage>penalidades</style> e, em troca, concede {0} de <style=cIsHealing>barreira</style>.");
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_CHARGES", "Máximo de {0} cargas de <style=cIsUtility>purificação</style>.");
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_RECHARGE", "\nGanhe uma carga de {0}.");
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_RECHARGE_REDUCE", "\nGanhe uma carga de {0} <style=cStack>(-{1} por acúmulo)</style>.");
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_PROTECTION", "\nCada carga previne <style=cIsDamage>penalidades</style> {0}.");
				ZetItemTweaksPlugin.RegisterFragment("IMMUNITY_PROTECTION_BARRIER", "\nCada carga previne <style=cIsDamage>penalidades</style> {0} e gera uma {1} <style=cIsHealing>barreira</style>.");
				ZetItemTweaksPlugin.RegisterFragment("SAFE_REGENERATION", "\nAumenta a <style=cIsHealing>regeneração de saúde</style> em {0} enquanto fora de perigo.");
				ZetItemTweaksPlugin.RegisterFragment("BEN_PICKUP_CHEATBARRIER", "Previne penalidades, e, em troca, concede uma barreira temporária.");
				ZetItemTweaksPlugin.RegisterFragment("BEN_PICKUP_CHEAT", "Se torna imune a penalidades.");
				ZetItemTweaksPlugin.RegisterFragment("BEN_PICKUP_CHARGEBARRIER", "Previne penalidades, e, em troca, concede uma barreira temporária. Recharrega ao longo do temp.");
				ZetItemTweaksPlugin.RegisterFragment("BEN_PICKUP_CHARGE", "Previne penalidades. Recharrega ao longo do tempo.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_IMMUNETODEBUFF_DESC", DescriptionText());
				ZetItemTweaksPlugin.RegisterToken("ITEM_IMMUNETODEBUFF_PICKUP", PickupText());
				ZetItemTweaksPlugin.targetLanguage = "";
			}
			appliedChanges = true;
		}
	}

	private static string DescriptionText()
	{
		string text = "";
		if (BaseHealth.Value > 0f)
		{
			text += string.Format(ZetItemTweaksPlugin.TextFragment("STAT_HEALTH", trim: true), ZetItemTweaksPlugin.ScalingText(BaseHealth.Value, StackHealth.Value, "flat", "cIsHealing"));
		}
		if (BaseHealthPercent.Value > 0f)
		{
			if (text != "")
			{
				text += "\n";
			}
			text += string.Format(ZetItemTweaksPlugin.TextFragment("STAT_HEALTH", trim: true), ZetItemTweaksPlugin.ScalingText(BaseHealthPercent.Value, StackHealthPercent.Value, "percent", "cIsHealing"));
		}
		if (ImmunityCheat.Value)
		{
			if (text != "")
			{
				text += "\n";
			}
			text = ((!(BaseBarrierRecovery.Value > 0f)) ? (text + ZetItemTweaksPlugin.TextFragment("IMMUNITY_CHEAT")) : (text + string.Format(ZetItemTweaksPlugin.TextFragment("IMMUNITY_CHEAT_BARRIER"), ZetItemTweaksPlugin.ScalingText(BaseBarrierRecovery.Value, StackBarrierRecovery.Value, "percent", "cIsHealing"))));
		}
		else
		{
			if (text != "")
			{
				text += "\n";
			}
			text += string.Format(ZetItemTweaksPlugin.TextFragment("IMMUNITY_CHARGES"), ZetItemTweaksPlugin.ScalingText(BaseImmunity.Value, StackImmunity.Value, "flat", "cIsUtility"));
			text = ((StackReduction.Value != 0f) ? (text + string.Format(ZetItemTweaksPlugin.TextFragment("IMMUNITY_RECHARGE_REDUCE"), ZetItemTweaksPlugin.SecondText(BaseRecharge.Value, "every", "cIsUtility"), ZetItemTweaksPlugin.ScalingText(StackReduction.Value, "percent"))) : (text + string.Format(ZetItemTweaksPlugin.TextFragment("IMMUNITY_RECHARGE"), ZetItemTweaksPlugin.SecondText(BaseRecharge.Value, "every", "cIsUtility"))));
			text = ((!(BaseBarrierRecovery.Value > 0f)) ? (text + string.Format(ZetItemTweaksPlugin.TextFragment("IMMUNITY_PROTECTION"), ZetItemTweaksPlugin.SecondText(ImmunityDuration.Value, "for"))) : (text + string.Format(ZetItemTweaksPlugin.TextFragment("IMMUNITY_PROTECTION_BARRIER"), ZetItemTweaksPlugin.SecondText(ImmunityDuration.Value, "for"), ZetItemTweaksPlugin.ScalingText(BaseBarrierRecovery.Value, StackBarrierRecovery.Value, "percent", "cIsHealing"))));
		}
		if (BaseSafeRegenFraction.Value > 0f)
		{
			text += string.Format(ZetItemTweaksPlugin.TextFragment("SAFE_REGENERATION"), ZetItemTweaksPlugin.ScalingText(BaseSafeRegenFraction.Value, StackSafeRegenFraction.Value, "percentregen", "cIsHealing"));
		}
		return text;
	}

	private static string PickupText()
	{
		if (ImmunityCheat.Value)
		{
			if (BaseBarrierRecovery.Value > 0f)
			{
				return ZetItemTweaksPlugin.TextFragment("BEN_PICKUP_CHEATBARRIER");
			}
			return ZetItemTweaksPlugin.TextFragment("BEN_PICKUP_CHEAT");
		}
		if (BaseBarrierRecovery.Value > 0f)
		{
			return ZetItemTweaksPlugin.TextFragment("BEN_PICKUP_CHARGEBARRIER");
		}
		return ZetItemTweaksPlugin.TextFragment("BEN_PICKUP_CHARGE");
	}

	private static void AttachTrackerHook()
	{
		//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
		object obj = <>c.<>9__82_0;
		if (obj == null)
		{
			hook_RecalculateStats val = delegate(orig_RecalculateStats orig, CharacterBody self)
			{
				orig.Invoke(self);
				if (NetworkServer.active && Object.op_Implicit((Object)(object)self))
				{
					UpdateImmunityTracker(self);
				}
			};
			<>c.<>9__82_0 = val;
			obj = (object)val;
		}
		CharacterBody.RecalculateStats += (hook_RecalculateStats)obj;
	}

	private static void UpdateImmunityTracker(CharacterBody self)
	{
		Inventory inventory = self.inventory;
		if (Object.op_Implicit((Object)(object)inventory))
		{
			int itemCount = inventory.GetItemCount(Items.ImmuneToDebuff);
			ImmunityTracker immunityTracker = ((Component)self).GetComponent<ImmunityTracker>();
			if (!Object.op_Implicit((Object)(object)immunityTracker) && itemCount > 0)
			{
				immunityTracker = ((Component)self).gameObject.AddComponent<ImmunityTracker>();
				immunityTracker.body = self;
			}
			if (Object.op_Implicit((Object)(object)immunityTracker))
			{
				immunityTracker.UpdateStacks(itemCount);
			}
		}
	}

	private static void DisableDefaultHook()
	{
		//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
		//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
		object obj = <>c.<>9__84_0;
		if (obj == null)
		{
			hook_OnEnable val = delegate
			{
			};
			<>c.<>9__84_0 = val;
			obj = (object)val;
		}
		ImmuneToDebuffBehavior.OnEnable += (hook_OnEnable)obj;
		object obj2 = <>c.<>9__84_1;
		if (obj2 == null)
		{
			hook_OnDisable val2 = delegate
			{
			};
			<>c.<>9__84_1 = val2;
			obj2 = (object)val2;
		}
		ImmuneToDebuffBehavior.OnDisable += (hook_OnDisable)obj2;
		object obj3 = <>c.<>9__84_2;
		if (obj3 == null)
		{
			hook_FixedUpdate val3 = delegate
			{
			};
			<>c.<>9__84_2 = val3;
			obj3 = (object)val3;
		}
		ImmuneToDebuffBehavior.FixedUpdate += (hook_FixedUpdate)obj3;
	}

	private static void TryApplyOverrideHook()
	{
		//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
		object obj = <>c.<>9__85_0;
		if (obj == null)
		{
			hook_TryApplyOverride val = delegate(orig_TryApplyOverride orig, CharacterBody body)
			{
				ImmunityTracker component = ((Component)body).GetComponent<ImmunityTracker>();
				if (Object.op_Implicit((Object)(object)component))
				{
					if (component.isProtected)
					{
						return true;
					}
					if (component.canProtect)
					{
						component.TriggerProtection();
						return true;
					}
				}
				return false;
			};
			<>c.<>9__85_0 = val;
			obj = (object)val;
		}
		ImmuneToDebuffBehavior.TryApplyOverride += (hook_TryApplyOverride)obj;
	}

	private static void HandleCleanseHook()
	{
		//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
		object obj = <>c.<>9__86_0;
		if (obj == null)
		{
			hook_CleanseBody val = delegate(orig_CleanseBody orig, CharacterBody body, bool debuff, bool buff, bool cooldown, bool dot, bool stun, bool proj)
			{
				if (Object.op_Implicit((Object)(object)body) && cooldown)
				{
					ImmunityTracker component = ((Component)body).GetComponent<ImmunityTracker>();
					if (Object.op_Implicit((Object)(object)component))
					{
						component.CleanseCooldown();
					}
				}
				orig.Invoke(body, debuff, buff, cooldown, dot, stun, proj);
			};
			<>c.<>9__86_0 = val;
			obj = (object)val;
		}
		Util.CleanseBody += (hook_CleanseBody)obj;
	}
}
public class ImmunityTracker : MonoBehaviour
{
	public CharacterBody body;

	public bool isProtected = false;

	public bool canProtect = false;

	private int ItemCount = 0;

	private float RecoveryFraction = 0f;

	private bool ProtectionCheat = false;

	private int ProtectionLimit = 0;

	private int ProtectionCount = 0;

	private float ProtectionDuration = 0.25f;

	private float ProtectionTimer = 0f;

	private float RechargeInterval = 5f;

	private float RechargeTimer = 0f;

	public void FixedUpdate()
	{
		//IL_0167: Unknown result type (might be due to invalid IL or missing references)
		//IL_019e: Unknown result type (might be due to invalid IL or missing references)
		float fixedDeltaTime = Time.fixedDeltaTime;
		isProtected = ProtectionTimer > 0f;
		ProtectionTimer = Mathf.Max(0f, ProtectionTimer - fixedDeltaTime);
		int num = 0;
		int num2 = 0;
		if (ProtectionCheat)
		{
			canProtect = ProtectionLimit > 0;
			ProtectionCount = 0;
			RechargeTimer = RechargeInterval;
		}
		else
		{
			if (ProtectionCount < ProtectionLimit)
			{
				if (!isProtected)
				{
					RechargeTimer -= fixedDeltaTime;
				}
				if (RechargeTimer <= 0f)
				{
					ProtectionCount++;
					RechargeTimer += RechargeInterval;
				}
			}
			else
			{
				RechargeTimer = RechargeInterval;
			}
			if (ProtectionLimit > 0)
			{
				if (ProtectionCount > 0)
				{
					canProtect = true;
					num2 = ProtectionCount;
				}
				else
				{
					canProtect = false;
					num = Mathf.CeilToInt(RechargeTimer);
				}
			}
			else
			{
				canProtect = false;
			}
		}
		int buffCount = body.GetBuffCount(Buffs.ImmuneToDebuffCooldown);
		if (buffCount != num)
		{
			body.SetBuffCount(Buffs.ImmuneToDebuffCooldown.buffIndex, num);
		}
		buffCount = body.GetBuffCount(Buffs.ImmuneToDebuffReady);
		if (buffCount != num2)
		{
			body.SetBuffCount(Buffs.ImmuneToDebuffReady.buffIndex, num2);
		}
	}

	public void UpdateStacks(int count)
	{
		if (ItemCount == count)
		{
			return;
		}
		if (count > 0)
		{
			ProtectionLimit = BensRainCoat.BaseImmunity.Value + BensRainCoat.StackImmunity.Value * (count - 1);
			RechargeInterval = BensRainCoat.BaseRecharge.Value * Mathf.Pow(1f - BensRainCoat.StackReduction.Value, (float)(count - 1));
			ProtectionCheat = BensRainCoat.ImmunityCheat.Value;
			if (BensRainCoat.BaseBarrierRecovery.Value > 0f)
			{
				RecoveryFraction = BensRainCoat.BaseBarrierRecovery.Value + BensRainCoat.StackBarrierRecovery.Value * (float)(count - 1);
			}
			else
			{
				RecoveryFraction = 0f;
			}
		}
		else
		{
			ProtectionLimit = 0;
			RechargeInterval = BensRainCoat.BaseRecharge.Value;
			ProtectionCheat = false;
			RecoveryFraction = 0f;
		}
		if (ProtectionCheat)
		{
			ProtectionDuration = BensRainCoat.ImmunityCheatDuration.Value;
		}
		else
		{
			ProtectionDuration = BensRainCoat.ImmunityDuration.Value;
		}
		if (ProtectionCount > ProtectionLimit)
		{
			ProtectionCount = ProtectionLimit;
			RechargeTimer = RechargeInterval;
		}
		if (ItemCount == 0 && count > 0)
		{
			ProtectionCount = 1;
			RechargeTimer = RechargeInterval;
		}
		ItemCount = count;
	}

	public void TriggerProtection()
	{
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		isProtected = true;
		ProtectionCount--;
		ProtectionTimer = ProtectionDuration;
		if (Object.op_Implicit((Object)(object)BensRainCoat.ImmunityEffectPrefab))
		{
			EffectManager.SimpleImpactEffect(BensRainCoat.ImmunityEffectPrefab, body.corePosition, Vector3.up, true);
		}
		if (RecoveryFraction > 0f)
		{
			HealthComponent healthComponent = body.healthComponent;
			if (Object.op_Implicit((Object)(object)healthComponent))
			{
				healthComponent.AddBarrier(RecoveryFraction * healthComponent.fullCombinedHealth);
			}
		}
	}

	public void CleanseCooldown()
	{
		//IL_004e: 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)
		if (!ProtectionCheat && ProtectionCount <= 0 && ProtectionLimit > 0)
		{
			canProtect = true;
			ProtectionCount = 1;
			RechargeTimer = RechargeInterval;
			body.SetBuffCount(Buffs.ImmuneToDebuffCooldown.buffIndex, 0);
			body.SetBuffCount(Buffs.ImmuneToDebuffReady.buffIndex, 1);
		}
	}
}
public static class BerzerkersPauldron
{
	[CompilerGenerated]
	private sealed class <>c__DisplayClass45_0
	{
		public int index;

		internal bool <DisableDefaultHook>b__3(Instruction x)
		{
			return ILPatternMatchingExt.MatchStloc(x, ref index);
		}
	}

	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static Func<Instruction, bool> <>9__45_1;

		public static Func<Instruction, bool> <>9__45_2;

		public static Manipulator <>9__45_0;

		public static hook_OnCharacterDeath <>9__46_0;

		internal void <DisableDefaultHook>b__45_0(ILContext il)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			<>c__DisplayClass45_0 CS$<>8__locals0 = new <>c__DisplayClass45_0();
			ILCursor val = new ILCursor(il);
			CS$<>8__locals0.index = -1;
			if (val.TryGotoNext(new Func<Instruction, bool>[3]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Items), "WarCryOnMultiKill"),
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Inventory>(x, "GetItemCount"),
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref CS$<>8__locals0.index)
			}))
			{
				val.Index += 3;
				val.Emit(OpCodes.Ldc_I4, 0);
				val.Emit(OpCodes.Stloc, CS$<>8__locals0.index);
			}
			else
			{
				ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: DisableDefaultHook Failed!");
			}
		}

		internal bool <DisableDefaultHook>b__45_1(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdsfld(x, typeof(Items), "WarCryOnMultiKill");
		}

		internal bool <DisableDefaultHook>b__45_2(Instruction x)
		{
			return ILPatternMatchingExt.MatchCallOrCallvirt<Inventory>(x, "GetItemCount");
		}

		internal void <ApplyBuffHook>b__46_0(orig_OnCharacterDeath orig, GlobalEventManager self, DamageReport damageReport)
		{
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, damageReport);
			if (!NetworkServer.active || damageReport == null || !(BaseBuffDuration.Value > 0f) || !Object.op_Implicit((Object)(object)damageReport.attacker) || !Object.op_Implicit((Object)(object)damageReport.attackerBody))
			{
				return;
			}
			CharacterBody attackerBody = damageReport.attackerBody;
			if (!Object.op_Implicit((Object)(object)attackerBody))
			{
				return;
			}
			Inventory inventory = attackerBody.inventory;
			if (!Object.op_Implicit((Object)(object)inventory))
			{
				return;
			}
			int itemCount = inventory.GetItemCount(Items.WarCryOnMultiKill);
			if (itemCount > 0)
			{
				float num = BaseBuffDuration.Value + StackBuffDuration.Value * (float)(itemCount - 1);
				int num2 = BaseBuffCount.Value + StackBuffCount.Value * (itemCount - 1);
				attackerBody.AddTimedBuff(MultiKillBuff, num, num2);
				if (BuffRefresh.Value)
				{
					ZetItemTweaksPlugin.RefreshTimedBuffStacks(attackerBody, MultiKillBuff.buffIndex, num);
				}
			}
		}
	}

	internal static BuffDef MultiKillBuff;

	public static List<string> autoCompatList = new List<string> { "com.RiskyLives.RiskyMod" };

	public static string itemIdentifier = "BerzerkersPauldron";

	public static bool appliedChanges = false;

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

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

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

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

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

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

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

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

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

	internal static void Init()
	{
		SetupConfig();
		if (EnableChanges.Value > 0)
		{
			ZetItemTweaksPlugin.OnLateSetup = (Action)Delegate.Combine(ZetItemTweaksPlugin.OnLateSetup, new Action(LateSetup));
		}
	}

	private static void SetupConfig()
	{
		EnableChanges = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "EnableChanges", 1, ZetItemTweaksPlugin.SectionEnableDesc);
		if (ZetItemTweaksPlugin.GenerateOverrideText.Value)
		{
			OverrideText = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "OverrideText", defaultValue: true, "Replace item description text.");
		}
		BuffMove = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BuffMove", 0.075f, "Movement speed gained per buff.");
		BuffAtkSpd = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BuffAtkSpd", 0.15f, "Attack speed gained per buff.");
		BaseBuffCount = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseBuffCount", 3, "Maximum buff count gained from item.");
		StackBuffCount = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackBuffCount", 2, "Maximum buff count gained from item per stack.");
		BaseBuffDuration = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseBuffDuration", 4f, "Buff duration gained from item.");
		StackBuffDuration = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackBuffDuration", 0f, "Buff duration gained from item per stack.");
		BuffRefresh = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BuffRefresh", defaultValue: true, "Refresh all buff durations on kill.");
	}

	private static void LateSetup()
	{
		if (ZetItemTweaksPlugin.ProceedChanges(itemIdentifier, EnableChanges.Value, autoCompatList))
		{
			DisableDefaultHook();
			ApplyBuffHook();
			if (!ZetItemTweaksPlugin.GenerateOverrideText.Value || OverrideText.Value)
			{
				ZetItemTweaksPlugin.targetLanguage = "default";
				ZetItemTweaksPlugin.RegisterFragment("MULTIKILL_ATKSPD", "Killing an enemy increase <style=cIsDamage>attack speed</style> by {0} for {1}.");
				ZetItemTweaksPlugin.RegisterFragment("MULTIKILL_MOVE", "Killing an enemy increase <style=cIsUtility>movement speed</style> by {0} for {1}.");
				ZetItemTweaksPlugin.RegisterFragment("MULTIKILL_BOTH", "Killing an enemy increase <style=cIsUtility>movement speed</style> by {0} and <style=cIsDamage>attack speed</style> by {1} for {2}.");
				ZetItemTweaksPlugin.RegisterFragment("MULTIKILL_ATKSPD_CAP", "\nMaximum cap of {0} <style=cIsDamage>attack speed</style>.");
				ZetItemTweaksPlugin.RegisterFragment("MULTIKILL_MOVE_CAP", "\nMaximum cap of {0} <style=cIsUtility>movement speed</style>.");
				ZetItemTweaksPlugin.RegisterFragment("MULTIKILL_BOTH_CAP", "\nMaximum cap of {0} <style=cIsUtility>movement speed</style> and {1} <style=cIsDamage>attack speed</style>.");
				ZetItemTweaksPlugin.RegisterFragment("BERZERK_PICKUP_BOTH", "Killing enemies grants movement speed and attack speed.");
				ZetItemTweaksPlugin.RegisterFragment("BERZERK_PICKUP_MOVESPD", "Killing enemies grants movement speed.");
				ZetItemTweaksPlugin.RegisterFragment("BERZERK_PICKUP_ATKSPD", "Killing enemies grants attack speed.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_WARCRYONMULTIKILL_DESC", DescriptionText());
				ZetItemTweaksPlugin.RegisterToken("ITEM_WARCRYONMULTIKILL_PICKUP", PickupText());
				ZetItemTweaksPlugin.targetLanguage = "pt-BR";
				ZetItemTweaksPlugin.RegisterFragment("MULTIKILL_ATKSPD", "Abater um inimigo aumenta a <style=cIsDamage>velocidade de ataque</style> em {0} por {1}.");
				ZetItemTweaksPlugin.RegisterFragment("MULTIKILL_MOVE", "Abater um inimigo aumenta a <style=cIsUtility>velocidade de movimento</style> em {0} por {1}.");
				ZetItemTweaksPlugin.RegisterFragment("MULTIKILL_BOTH", "Abater um inimigo aumenta a <style=cIsUtility>velocidade de movimento</style> em {0} e a <style=cIsDamage>velocidade de ataque</style> em {1} por {2}.");
				ZetItemTweaksPlugin.RegisterFragment("MULTIKILL_ATKSPD_CAP", "\nLimite máximo de {0} de <style=cIsDamage>velocidade de ataque</style>.");
				ZetItemTweaksPlugin.RegisterFragment("MULTIKILL_MOVE_CAP", "\nLimite máximo de {0} de <style=cIsUtility>velocidade de movimento</style>.");
				ZetItemTweaksPlugin.RegisterFragment("MULTIKILL_BOTH_CAP", "\nLimite máximo de {0} de <style=cIsUtility>velocidade de movimento</style> e {1} de <style=cIsDamage>velocidade de ataque</style>.");
				ZetItemTweaksPlugin.RegisterFragment("BERZERK_PICKUP_BOTH", "Abater um inimigos concede velocidade de movimento e velocidade de ataque.");
				ZetItemTweaksPlugin.RegisterFragment("BERZERK_PICKUP_MOVESPD", "Abater um inimigos concede velocidade de movimento.");
				ZetItemTweaksPlugin.RegisterFragment("BERZERK_PICKUP_ATKSPD", "Abater um inimigos concede velocidade de ataque.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_WARCRYONMULTIKILL_DESC", DescriptionText());
				ZetItemTweaksPlugin.RegisterToken("ITEM_WARCRYONMULTIKILL_PICKUP", PickupText());
				ZetItemTweaksPlugin.targetLanguage = "";
			}
			appliedChanges = true;
		}
	}

	private static string DescriptionText()
	{
		string result = "wat";
		if (BuffMove.Value > 0f && BuffAtkSpd.Value > 0f)
		{
			result = string.Format(ZetItemTweaksPlugin.TextFragment("MULTIKILL_BOTH"), ZetItemTweaksPlugin.ScalingText(BuffMove.Value, "percent", "cIsUtility"), ZetItemTweaksPlugin.ScalingText(BuffAtkSpd.Value, "percent", "cIsDamage"), ZetItemTweaksPlugin.ScalingText(BaseBuffDuration.Value, StackBuffDuration.Value, "duration", "cIsDamage"));
			result += string.Format(ZetItemTweaksPlugin.TextFragment("MULTIKILL_BOTH_CAP"), ZetItemTweaksPlugin.ScalingText(BuffMove.Value * (float)BaseBuffCount.Value, BuffMove.Value * (float)StackBuffCount.Value, "percent", "cIsUtility"), ZetItemTweaksPlugin.ScalingText(BuffAtkSpd.Value * (float)BaseBuffCount.Value, BuffAtkSpd.Value * (float)StackBuffCount.Value, "percent", "cIsDamage"));
		}
		else if (BuffMove.Value > 0f)
		{
			result = string.Format(ZetItemTweaksPlugin.TextFragment("MULTIKILL_MOVE"), ZetItemTweaksPlugin.ScalingText(BuffMove.Value, "percent", "cIsUtility"), ZetItemTweaksPlugin.ScalingText(BaseBuffDuration.Value, StackBuffDuration.Value, "duration", "cIsUtility"));
			result += string.Format(ZetItemTweaksPlugin.TextFragment("MULTIKILL_MOVE_CAP"), ZetItemTweaksPlugin.ScalingText(BuffMove.Value * (float)BaseBuffCount.Value, BuffMove.Value * (float)StackBuffCount.Value, "percent", "cIsUtility"));
		}
		else if (BuffAtkSpd.Value > 0f)
		{
			result = string.Format(ZetItemTweaksPlugin.TextFragment("MULTIKILL_ATKSPD"), ZetItemTweaksPlugin.ScalingText(BuffAtkSpd.Value, "percent", "cIsDamage"), ZetItemTweaksPlugin.ScalingText(BaseBuffDuration.Value, StackBuffDuration.Value, "duration", "cIsDamage"));
			result += string.Format(ZetItemTweaksPlugin.TextFragment("MULTIKILL_ATKSPD_CAP"), ZetItemTweaksPlugin.ScalingText(BuffAtkSpd.Value * (float)BaseBuffCount.Value, BuffAtkSpd.Value * (float)StackBuffCount.Value, "percent", "cIsDamage"));
		}
		return result;
	}

	private static string PickupText()
	{
		if (BuffMove.Value > 0f && BuffAtkSpd.Value > 0f)
		{
			return ZetItemTweaksPlugin.TextFragment("BERZERK_PICKUP_BOTH");
		}
		if (BuffMove.Value > 0f)
		{
			return ZetItemTweaksPlugin.TextFragment("BERZERK_PICKUP_MOVESPD");
		}
		if (BuffAtkSpd.Value > 0f)
		{
			return ZetItemTweaksPlugin.TextFragment("BERZERK_PICKUP_ATKSPD");
		}
		return "wat";
	}

	private static void DisableDefaultHook()
	{
		//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
		object obj = <>c.<>9__45_0;
		if (obj == null)
		{
			Manipulator val = delegate(ILContext il)
			{
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				//IL_000e: Expected O, but got Unknown
				//IL_008b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0098: Unknown result type (might be due to invalid IL or missing references)
				ILCursor val2 = new ILCursor(il);
				int index = -1;
				if (val2.TryGotoNext(new Func<Instruction, bool>[3]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Items), "WarCryOnMultiKill"),
					(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Inventory>(x, "GetItemCount"),
					(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref index)
				}))
				{
					val2.Index += 3;
					val2.Emit(OpCodes.Ldc_I4, 0);
					val2.Emit(OpCodes.Stloc, index);
				}
				else
				{
					ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: DisableDefaultHook Failed!");
				}
			};
			<>c.<>9__45_0 = val;
			obj = (object)val;
		}
		CharacterBody.AddMultiKill += (Manipulator)obj;
	}

	private static void ApplyBuffHook()
	{
		//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
		object obj = <>c.<>9__46_0;
		if (obj == null)
		{
			hook_OnCharacterDeath val = delegate(orig_OnCharacterDeath orig, GlobalEventManager self, DamageReport damageReport)
			{
				//IL_0106: Unknown result type (might be due to invalid IL or missing references)
				orig.Invoke(self, damageReport);
				if (NetworkServer.active && damageReport != null && BaseBuffDuration.Value > 0f && Object.op_Implicit((Object)(object)damageReport.attacker) && Object.op_Implicit((Object)(object)damageReport.attackerBody))
				{
					CharacterBody attackerBody = damageReport.attackerBody;
					if (Object.op_Implicit((Object)(object)attackerBody))
					{
						Inventory inventory = attackerBody.inventory;
						if (Object.op_Implicit((Object)(object)inventory))
						{
							int itemCount = inventory.GetItemCount(Items.WarCryOnMultiKill);
							if (itemCount > 0)
							{
								float num = BaseBuffDuration.Value + StackBuffDuration.Value * (float)(itemCount - 1);
								int num2 = BaseBuffCount.Value + StackBuffCount.Value * (itemCount - 1);
								attackerBody.AddTimedBuff(MultiKillBuff, num, num2);
								if (BuffRefresh.Value)
								{
									ZetItemTweaksPlugin.RefreshTimedBuffStacks(attackerBody, MultiKillBuff.buffIndex, num);
								}
							}
						}
					}
				}
			};
			<>c.<>9__46_0 = val;
			obj = (object)val;
		}
		GlobalEventManager.OnCharacterDeath += (hook_OnCharacterDeath)obj;
	}
}
public static class BisonSteak
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_OnCharacterDeath <>9__44_0;

		internal void <MeatRegenHook>b__44_0(orig_OnCharacterDeath orig, GlobalEventManager self, DamageReport damageReport)
		{
			orig.Invoke(self, damageReport);
			if (!NetworkServer.active || damageReport == null || !(BaseKillRegen.Value > 0f) || !(BaseBuffDuration.Value > 0f) || !Object.op_Implicit((Object)(object)damageReport.attacker) || !Object.op_Implicit((Object)(object)damageReport.attackerBody))
			{
				return;
			}
			CharacterBody attackerBody = damageReport.attackerBody;
			if (!Object.op_Implicit((Object)(object)attackerBody))
			{
				return;
			}
			Inventory inventory = attackerBody.inventory;
			if (Object.op_Implicit((Object)(object)inventory))
			{
				int itemCount = inventory.GetItemCount(Items.FlatHealth);
				if (itemCount > 0)
				{
					float num = BaseBuffDuration.Value + StackBuffDuration.Value * (float)(itemCount - 1);
					attackerBody.AddTimedBuff(Buffs.MeatRegenBoost, num);
				}
			}
		}
	}

	public static List<string> autoCompatList = new List<string> { "com.RiskyLives.RiskyMod", "com.kking117.FlatItemBuff", "Hayaku.VanillaRebalance", "com.OkIGotIt.Fresh_Bison_Steak" };

	public static string itemIdentifier = "BisonSteak";

	public static bool appliedChanges = false;

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

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

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

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

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

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

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

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

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

	internal static void Init()
	{
		SetupConfig();
		if (EnableChanges.Value > 0)
		{
			ZetItemTweaksPlugin.OnLateSetup = (Action)Delegate.Combine(ZetItemTweaksPlugin.OnLateSetup, new Action(LateSetup));
		}
	}

	private static void SetupConfig()
	{
		EnableChanges = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "EnableChanges", 1, ZetItemTweaksPlugin.SectionEnableDesc);
		if (ZetItemTweaksPlugin.GenerateOverrideText.Value)
		{
			OverrideText = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "OverrideText", defaultValue: true, "Replace item description text.");
		}
		BaseHealth = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseHealth", 25f, "Health gained from item.");
		StackHealth = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackHealth", 25f, "Health gained from item per stack.");
		BuffStack = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BuffStack", defaultValue: true, "Whether buff can stack.");
		BaseKillRegen = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseKillRegen", 2.4f, "Health regeneration gained from buff.");
		StackKillRegen = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackKillRegen", 0f, "Health regeneration gained from buff per item stack.");
		BaseBuffDuration = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseBuffDuration", 3f, "Regeneration buff duration.");
		StackBuffDuration = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackBuffDuration", 2f, "Regeneration buff duration per stack.");
	}

	private static void LateSetup()
	{
		if (ZetItemTweaksPlugin.ProceedChanges(itemIdentifier, EnableChanges.Value, autoCompatList))
		{
			Buffs.MeatRegenBoost.canStack = BuffStack.Value;
			MeatRegenHook();
			if (!ZetItemTweaksPlugin.GenerateOverrideText.Value || OverrideText.Value)
			{
				ZetItemTweaksPlugin.targetLanguage = "default";
				ZetItemTweaksPlugin.RegisterFragment("REGEN_ON_KILL", "\nKilling an enemy increases <style=cIsHealing>health regeneration</style> by {0} for {1} seconds.");
				ZetItemTweaksPlugin.RegisterFragment("STEAK_PICKUP_HEALTHREGEN", "Increase max health. Boost regen on kill.");
				ZetItemTweaksPlugin.RegisterFragment("STEAK_PICKUP_HEALTH", "Increase max health.");
				ZetItemTweaksPlugin.RegisterFragment("STEAK_PICKUP_REGEN", "Boost regen on kill.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_FLATHEALTH_DESC", DescriptionText());
				ZetItemTweaksPlugin.RegisterToken("ITEM_FLATHEALTH_PICKUP", PickupText());
				ZetItemTweaksPlugin.targetLanguage = "pt-BR";
				ZetItemTweaksPlugin.RegisterFragment("REGEN_ON_KILL", "\nAbater um inimigo aumenta a <style=cIsHealing>regeneração de saúde</style> em {0} por {1} segundos.");
				ZetItemTweaksPlugin.RegisterFragment("STEAK_PICKUP_HEALTHREGEN", "Aumenta a saúde máxima. Concede um bônus de regeneração no abate.");
				ZetItemTweaksPlugin.RegisterFragment("STEAK_PICKUP_HEALTH", "Aumenta a saúde máxima.");
				ZetItemTweaksPlugin.RegisterFragment("STEAK_PICKUP_REGEN", "Concede um bônus de regeneração no abate.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_FLATHEALTH_DESC", DescriptionText());
				ZetItemTweaksPlugin.RegisterToken("ITEM_FLATHEALTH_PICKUP", PickupText());
				ZetItemTweaksPlugin.targetLanguage = "";
			}
			appliedChanges = true;
		}
	}

	private static string DescriptionText()
	{
		string text = "";
		if (BaseHealth.Value > 0f)
		{
			text += string.Format(ZetItemTweaksPlugin.TextFragment("STAT_HEALTH", trim: true), ZetItemTweaksPlugin.ScalingText(BaseHealth.Value, StackHealth.Value, "flat", "cIsHealing"));
		}
		if (BaseKillRegen.Value > 0f && BaseBuffDuration.Value > 0f)
		{
			if (text != "")
			{
				text += "\n";
			}
			text += string.Format(ZetItemTweaksPlugin.TextFragment("REGEN_ON_KILL", trim: true), ZetItemTweaksPlugin.ScalingText(BaseKillRegen.Value, StackKillRegen.Value, "flatregen", "cIsHealing"), ZetItemTweaksPlugin.ScalingText(BaseBuffDuration.Value, StackBuffDuration.Value, "flat", "cIsUtility"));
		}
		if (text == "")
		{
			text += ZetItemTweaksPlugin.TextFragment("CFG_NO_EFFECT");
		}
		return text;
	}

	private static string PickupText()
	{
		bool flag = BaseKillRegen.Value > 0f && BaseBuffDuration.Value > 0f;
		if (BaseHealth.Value > 0f)
		{
			if (flag)
			{
				return ZetItemTweaksPlugin.TextFragment("STEAK_PICKUP_HEALTHREGEN");
			}
			return ZetItemTweaksPlugin.TextFragment("STEAK_PICKUP_HEALTH");
		}
		if (flag)
		{
			return ZetItemTweaksPlugin.TextFragment("STEAK_PICKUP_REGEN");
		}
		return ZetItemTweaksPlugin.TextFragment("PICKUP_NO_EFFECT");
	}

	private static void MeatRegenHook()
	{
		//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
		object obj = <>c.<>9__44_0;
		if (obj == null)
		{
			hook_OnCharacterDeath val = delegate(orig_OnCharacterDeath orig, GlobalEventManager self, DamageReport damageReport)
			{
				orig.Invoke(self, damageReport);
				if (NetworkServer.active && damageReport != null && BaseKillRegen.Value > 0f && BaseBuffDuration.Value > 0f && Object.op_Implicit((Object)(object)damageReport.attacker) && Object.op_Implicit((Object)(object)damageReport.attackerBody))
				{
					CharacterBody attackerBody = damageReport.attackerBody;
					if (Object.op_Implicit((Object)(object)attackerBody))
					{
						Inventory inventory = attackerBody.inventory;
						if (Object.op_Implicit((Object)(object)inventory))
						{
							int itemCount = inventory.GetItemCount(Items.FlatHealth);
							if (itemCount > 0)
							{
								float num = BaseBuffDuration.Value + StackBuffDuration.Value * (float)(itemCount - 1);
								attackerBody.AddTimedBuff(Buffs.MeatRegenBoost, num);
							}
						}
					}
				}
			};
			<>c.<>9__44_0 = val;
			obj = (object)val;
		}
		GlobalEventManager.OnCharacterDeath += (hook_OnCharacterDeath)obj;
	}
}
public static class BlackMonolith
{
	internal static Sprite PickupIcon;

	public static List<string> autoCompatList = new List<string>();

	public static string itemIdentifier = "BlackMonolith";

	public static bool appliedChanges = false;

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

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

	internal static void Init()
	{
		SetupConfig();
		if (EnableChanges.Value > 0)
		{
			ZetItemTweaksPlugin.OnItemCatalogPreInit = (Action)Delegate.Combine(ZetItemTweaksPlugin.OnItemCatalogPreInit, new Action(ModifyItem));
		}
	}

	private static void SetupConfig()
	{
		EnableChanges = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "EnableChanges", 0, ZetItemTweaksPlugin.SectionEnableDesc);
		RedTier = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "RedTier", defaultValue: true, "Change item to red tier.");
	}

	private static void ModifyItem()
	{
		if (!ZetItemTweaksPlugin.ProceedChanges(itemIdentifier, EnableChanges.Value, "com.themysticsword.mysticsitems", (ZetItemTweaksPlugin.Feedback)13))
		{
			return;
		}
		bool flag = false;
		ItemDef val = ZetItemTweaksPlugin.FindItemDefPreCatalogInit("MysticsItems_ExtraShrineUse");
		if (!Object.op_Implicit((Object)(object)val))
		{
			return;
		}
		if (RedTier.Value)
		{
			val._itemTierDef = LegacyResourcesAPI.Load<ItemTierDef>("ItemTierDefs/Tier3Def");
			ZetItemTweaksPlugin.AssignDepricatedTier(val, (ItemTier)2);
			if (Object.op_Implicit((Object)(object)PickupIcon))
			{
				val.pickupIconSprite = PickupIcon;
			}
			flag = true;
		}
		if (flag)
		{
			ZetItemTweaksPlugin.ModifiedItemDefCount++;
			ZetItemTweaksPlugin.AddTweakedItem(itemIdentifier);
			appliedChanges = true;
		}
	}
}
public static class BrainStalks
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_OnExecute <>9__30_0;

		public static Func<Instruction, bool> <>9__31_1;

		public static Func<Instruction, bool> <>9__31_2;

		public static Func<Instruction, bool> <>9__31_3;

		public static Manipulator <>9__31_0;

		public static Func<Instruction, bool> <>9__32_1;

		public static Func<Instruction, bool> <>9__32_2;

		public static Func<Instruction, bool> <>9__32_3;

		public static Func<Instruction, bool> <>9__32_4;

		public static Func<int, float> <>9__32_5;

		public static Manipulator <>9__32_0;

		internal void <RestockHook>b__30_0(orig_OnExecute orig, SkillDef self, GenericSkill slot)
		{
			orig.Invoke(self, slot);
			if (!slot.beginSkillCooldownOnSkillEnd && slot.characterBody.HasBuff(Buffs.NoCooldowns) && Restock.Value)
			{
				slot.RestockSteplike();
			}
		}

		internal void <FindIndexHook>b__31_0(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			ILCursor val = new ILCursor(il);
			if (val.TryGotoNext(new Func<Instruction, bool>[3]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Items).GetField("KillEliteFrenzy")),
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Inventory>(x, "GetItemCount"),
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref ItemCountLocIndex)
			}))
			{
				StlocCursorIndex = val.Index;
			}
			else
			{
				ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: FindIndexHook Failed!");
			}
		}

		internal bool <FindIndexHook>b__31_1(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdsfld(x, typeof(Items).GetField("KillEliteFrenzy"));
		}

		internal bool <FindIndexHook>b__31_2(Instruction x)
		{
			return ILPatternMatchingExt.MatchCallOrCallvirt<Inventory>(x, "GetItemCount");
		}

		internal bool <FindIndexHook>b__31_3(Instruction x)
		{
			return ILPatternMatchingExt.MatchStloc(x, ref ItemCountLocIndex);
		}

		internal void <DurationHook>b__32_0(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.Index = StlocCursorIndex;
			if (val.TryGotoNext(new Func<Instruction, bool>[4]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ItemCountLocIndex),
				(Instruction x) => ILPatternMatchingExt.MatchConvR4(x),
				(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 4f),
				(Instruction x) => ILPatternMatchingExt.MatchMul(x)
			}))
			{
				val.Index += 4;
				val.Emit(OpCodes.Pop);
				val.Emit(OpCodes.Ldloc, ItemCountLocIndex);
				val.EmitDelegate<Func<int, float>>((Func<int, float>)((int count) => BaseDuration.Value + StackDuration.Value * (float)(count - 1)));
			}
			else
			{
				ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: DurationHook Failed!");
			}
		}

		internal bool <DurationHook>b__32_1(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdloc(x, ItemCountLocIndex);
		}

		internal bool <DurationHook>b__32_2(Instruction x)
		{
			return ILPatternMatchingExt.MatchConvR4(x);
		}

		internal bool <DurationHook>b__32_3(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdcR4(x, 4f);
		}

		internal bool <DurationHook>b__32_4(Instruction x)
		{
			return ILPatternMatchingExt.MatchMul(x);
		}

		internal float <DurationHook>b__32_5(int count)
		{
			return BaseDuration.Value + StackDuration.Value * (float)(count - 1);
		}
	}

	public static List<string> autoCompatList = new List<string>();

	public static string itemIdentifier = "BrainStalks";

	public static bool appliedChanges = false;

	public static bool appliedRestock = false;

	private static int ItemCountLocIndex = 0;

	private static int StlocCursorIndex = 0;

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

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

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

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

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

	internal static void Init()
	{
		SetupConfig();
		if (EnableChanges.Value > 0)
		{
			ZetItemTweaksPlugin.OnLateSetup = (Action)Delegate.Combine(ZetItemTweaksPlugin.OnLateSetup, new Action(LateSetup));
		}
	}

	private static void SetupConfig()
	{
		EnableChanges = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "EnableChanges", 1, ZetItemTweaksPlugin.SectionEnableDesc);
		if (ZetItemTweaksPlugin.GenerateOverrideText.Value)
		{
			OverrideText = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "OverrideText", defaultValue: true, "Replace item description text.");
		}
		Restock = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "Restock", defaultValue: true, "Refund skill stock on use, bypassing 0.5 second cooldown.");
		BaseDuration = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseDuration", 4f, "Duration of buff gained from item.");
		StackDuration = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackDuration", 4f, "Duration of buff gained from item per stack.");
	}

	private static void LateSetup()
	{
		if (!ZetItemTweaksPlugin.ProceedChanges(itemIdentifier, EnableChanges.Value, autoCompatList))
		{
			return;
		}
		bool flag = Restock.Value;
		if (flag && ZetItemTweaksPlugin.PluginLoaded("xyz.yekoc.SnapStalk"))
		{
			ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: Restock Disabled because " + ZetItemTweaksPlugin.LastPluginChecked + " is installed!");
			flag = false;
		}
		if (flag)
		{
			RestockHook();
			appliedRestock = true;
		}
		FindIndexHook();
		if (ItemCountLocIndex != 0)
		{
			DurationHook();
			if (!ZetItemTweaksPlugin.GenerateOverrideText.Value || OverrideText.Value)
			{
				ZetItemTweaksPlugin.targetLanguage = "default";
				ZetItemTweaksPlugin.RegisterFragment("BRAINSTALK_DURATION", "Upon killing an elite monster, <style=cIsDamage>enter a frenzy</style> for {0}");
				ZetItemTweaksPlugin.RegisterFragment("BRAINSTALK_EFFECT", " where <style=cIsUtility>skills have no cooldowns</style>.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_KILLELITEFRENZY_DESC", DescriptionText());
				ZetItemTweaksPlugin.targetLanguage = "pt-BR";
				ZetItemTweaksPlugin.RegisterFragment("BRAINSTALK_DURATION", "Ao abater um monstro de elite, <style=cIsDamage>entre em frenesi</style> por {0}");
				ZetItemTweaksPlugin.RegisterFragment("BRAINSTALK_EFFECT", " em que <style=cIsUtility>as habilidades não têm tempo de recarga</style>.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_KILLELITEFRENZY_DESC", DescriptionText());
				ZetItemTweaksPlugin.targetLanguage = "";
			}
			appliedChanges = true;
		}
		else
		{
			ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: LateSetup Failed!");
		}
	}

	private static string DescriptionText()
	{
		string text = string.Format(ZetItemTweaksPlugin.TextFragment("BRAINSTALK_DURATION", trim: true), ZetItemTweaksPlugin.ScalingText(BaseDuration.Value, StackDuration.Value, "duration", "cIsDamage"));
		return text + ZetItemTweaksPlugin.TextFragment("BRAINSTALK_EFFECT");
	}

	private static void RestockHook()
	{
		//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
		object obj = <>c.<>9__30_0;
		if (obj == null)
		{
			hook_OnExecute val = delegate(orig_OnExecute orig, SkillDef self, GenericSkill slot)
			{
				orig.Invoke(self, slot);
				if (!slot.beginSkillCooldownOnSkillEnd && slot.characterBody.HasBuff(Buffs.NoCooldowns) && Restock.Value)
				{
					slot.RestockSteplike();
				}
			};
			<>c.<>9__30_0 = val;
			obj = (object)val;
		}
		SkillDef.OnExecute += (hook_OnExecute)obj;
	}

	private static void FindIndexHook()
	{
		//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
		object obj = <>c.<>9__31_0;
		if (obj == null)
		{
			Manipulator val = delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				ILCursor val2 = new ILCursor(il);
				if (val2.TryGotoNext(new Func<Instruction, bool>[3]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Items).GetField("KillEliteFrenzy")),
					(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Inventory>(x, "GetItemCount"),
					(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref ItemCountLocIndex)
				}))
				{
					StlocCursorIndex = val2.Index;
				}
				else
				{
					ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: FindIndexHook Failed!");
				}
			};
			<>c.<>9__31_0 = val;
			obj = (object)val;
		}
		GlobalEventManager.OnCharacterDeath += (Manipulator)obj;
	}

	private static void DurationHook()
	{
		//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
		object obj = <>c.<>9__32_0;
		if (obj == null)
		{
			Manipulator val = delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
				ILCursor val2 = new ILCursor(il);
				val2.Index = StlocCursorIndex;
				if (val2.TryGotoNext(new Func<Instruction, bool>[4]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ItemCountLocIndex),
					(Instruction x) => ILPatternMatchingExt.MatchConvR4(x),
					(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 4f),
					(Instruction x) => ILPatternMatchingExt.MatchMul(x)
				}))
				{
					val2.Index += 4;
					val2.Emit(OpCodes.Pop);
					val2.Emit(OpCodes.Ldloc, ItemCountLocIndex);
					val2.EmitDelegate<Func<int, float>>((Func<int, float>)((int count) => BaseDuration.Value + StackDuration.Value * (float)(count - 1)));
				}
				else
				{
					ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: DurationHook Failed!");
				}
			};
			<>c.<>9__32_0 = val;
			obj = (object)val;
		}
		GlobalEventManager.OnCharacterDeath += (Manipulator)obj;
	}
}
public static class BrilliantBehemoth
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static Func<Instruction, bool> <>9__35_1;

		public static Func<DamageInfo, int, float> <>9__35_2;

		public static Manipulator <>9__35_0;

		public static Func<Instruction, bool> <>9__36_1;

		public static Func<int, float> <>9__36_2;

		public static Manipulator <>9__36_0;

		public static Func<Instruction, bool> <>9__37_1;

		public static Func<Instruction, bool> <>9__37_2;

		public static Func<Instruction, bool> <>9__37_3;

		public static Func<BlastAttack, BlastAttack> <>9__37_4;

		public static Manipulator <>9__37_0;

		internal void <RadiusHook>b__35_0(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			if (val.TryGotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, 4)
			}))
			{
				val.Index += 1;
				val.Emit(OpCodes.Ldarg, 1);
				val.Emit(OpCodes.Ldloc, 3);
				val.EmitDelegate<Func<DamageInfo, int, float>>((Func<DamageInfo, int, float>)delegate(DamageInfo damageInfo, int count)
				{
					float num = Mathf.Max(0.25f, damageInfo.procCoefficient);
					return (BaseRadius.Value + StackRadius.Value * (float)(count - 1)) * num;
				});
				val.Emit(OpCodes.Stloc, 4);
			}
			else
			{
				ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: RadiusHook Failed!");
			}
		}

		internal bool <RadiusHook>b__35_1(Instruction x)
		{
			return ILPatternMatchingExt.MatchStloc(x, 4);
		}

		internal float <RadiusHook>b__35_2(DamageInfo damageInfo, int count)
		{
			float num = Mathf.Max(0.25f, damageInfo.procCoefficient);
			return (BaseRadius.Value + StackRadius.Value * (float)(count - 1)) * num;
		}

		internal void <DamageHook>b__36_0(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			if (val.TryGotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, 5)
			}))
			{
				val.Index += 1;
				val.Emit(OpCodes.Ldloc, 3);
				val.EmitDelegate<Func<int, float>>((Func<int, float>)((int count) => BaseDamage.Value + StackDamage.Value * (float)(count - 1)));
				val.Emit(OpCodes.Stloc, 5);
			}
			else
			{
				ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: DamageHook Failed!");
			}
		}

		internal bool <DamageHook>b__36_1(Instruction x)
		{
			return ILPatternMatchingExt.MatchStloc(x, 5);
		}

		internal float <DamageHook>b__36_2(int count)
		{
			return BaseDamage.Value + StackDamage.Value * (float)(count - 1);
		}

		internal void <FalloffHook>b__37_0(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			ILCursor val = new ILCursor(il);
			if (val.TryGotoNext(new Func<Instruction, bool>[2]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, 4),
				(Instruction x) => ILPatternMatchingExt.MatchStfld(x, typeof(BlastAttack).GetField("radius"))
			}))
			{
				int index = val.Index;
				if (val.TryGotoNext(new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, (MethodBase)typeof(BlastAttack).GetMethod("Fire"))
				}))
				{
					int num = val.Index - index;
					if (num <= 50)
					{
						val.EmitDelegate<Func<BlastAttack, BlastAttack>>((Func<BlastAttack, BlastAttack>)delegate(BlastAttack blastAttack)
						{
							//IL_001e: Unknown result type (might be due to invalid IL or missing references)
							int value = DamageFalloff.Value;
							if (value > 0 && value < 3)
							{
								blastAttack.falloffModel = (FalloffModel)value;
							}
							return blastAttack;
						});
					}
					else
					{
						ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: FalloffHook Failed! - BlastAttack.Fire Offset [" + num + "]");
					}
				}
				else
				{
					ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: FalloffHook Failed!");
				}
			}
			else
			{
				ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: FalloffHook:FindRadius Failed!");
			}
		}

		internal bool <FalloffHook>b__37_1(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdloc(x, 4);
		}

		internal bool <FalloffHook>b__37_2(Instruction x)
		{
			return ILPatternMatchingExt.MatchStfld(x, typeof(BlastAttack).GetField("radius"));
		}

		internal bool <FalloffHook>b__37_3(Instruction x)
		{
			return ILPatternMatchingExt.MatchCallOrCallvirt(x, (MethodBase)typeof(BlastAttack).GetMethod("Fire"));
		}

		internal BlastAttack <FalloffHook>b__37_4(BlastAttack blastAttack)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			int value = DamageFalloff.Value;
			if (value > 0 && value < 3)
			{
				blastAttack.falloffModel = (FalloffModel)value;
			}
			return blastAttack;
		}
	}

	public static List<string> autoCompatList = new List<string> { "com.RiskyLives.RiskyMod", "Hayaku.VanillaRebalance" };

	public static string itemIdentifier = "BrilliantBehemoth";

	public static bool appliedChanges = false;

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

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

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

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

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

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

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

	internal static void Init()
	{
		SetupConfig();
		if (EnableChanges.Value > 0)
		{
			ZetItemTweaksPlugin.OnLateSetup = (Action)Delegate.Combine(ZetItemTweaksPlugin.OnLateSetup, new Action(LateSetup));
		}
	}

	private static void SetupConfig()
	{
		EnableChanges = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "EnableChanges", 1, ZetItemTweaksPlugin.SectionEnableDesc);
		if (ZetItemTweaksPlugin.GenerateOverrideText.Value)
		{
			OverrideText = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "OverrideText", defaultValue: true, "Replace item description text.");
		}
		BaseDamage = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseDamage", 0.6f, "Explosion damage.");
		StackDamage = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackDamage", 0.2f, "Explosion damage per stack.");
		DamageFalloff = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "DamageFalloff", 1, "Explosion damage falloff. 0 = None, 1 = Linear, 2 = SweetSpot.");
		BaseRadius = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseRadius", 5f, "Explosion radius.");
		StackRadius = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackRadius", 2.5f, "Explosion radius per stack.");
	}

	private static void LateSetup()
	{
		if (ZetItemTweaksPlugin.ProceedChanges(itemIdentifier, EnableChanges.Value, autoCompatList))
		{
			RadiusHook();
			DamageHook();
			FalloffHook();
			if (!ZetItemTweaksPlugin.GenerateOverrideText.Value || OverrideText.Value)
			{
				ZetItemTweaksPlugin.targetLanguage = "default";
				ZetItemTweaksPlugin.RegisterFragment("EXPLODE_ON_HIT", "Attacks <style=cIsDamage>explode</style> on hit in a {0} radius for {1} TOTAL damage.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_BEHEMOTH_DESC", DescriptionText());
				ZetItemTweaksPlugin.targetLanguage = "pt-BR";
				ZetItemTweaksPlugin.RegisterFragment("EXPLODE_ON_HIT", "Ataques <style=cIsDamage>explodem</style> ao golpear em uma area de {0} que causa {1} de dano TOTAL.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_BEHEMOTH_DESC", DescriptionText());
				ZetItemTweaksPlugin.targetLanguage = "";
			}
			appliedChanges = true;
		}
	}

	private static string DescriptionText()
	{
		return string.Format(ZetItemTweaksPlugin.TextFragment("EXPLODE_ON_HIT"), ZetItemTweaksPlugin.ScalingText(BaseRadius.Value, StackRadius.Value, "distance", "cIsDamage"), ZetItemTweaksPlugin.ScalingText(BaseDamage.Value, StackDamage.Value, "percent", "cIsDamage"));
	}

	private static void RadiusHook()
	{
		//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
		object obj = <>c.<>9__35_0;
		if (obj == null)
		{
			Manipulator val = delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				//IL_004d: Unknown result type (might be due to invalid IL or missing references)
				//IL_005a: Unknown result type (might be due to invalid IL or missing references)
				//IL_008d: Unknown result type (might be due to invalid IL or missing references)
				ILCursor val2 = new ILCursor(il);
				if (val2.TryGotoNext(new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchStloc(x, 4)
				}))
				{
					val2.Index += 1;
					val2.Emit(OpCodes.Ldarg, 1);
					val2.Emit(OpCodes.Ldloc, 3);
					val2.EmitDelegate<Func<DamageInfo, int, float>>((Func<DamageInfo, int, float>)delegate(DamageInfo damageInfo, int count)
					{
						float num = Mathf.Max(0.25f, damageInfo.procCoefficient);
						return (BaseRadius.Value + StackRadius.Value * (float)(count - 1)) * num;
					});
					val2.Emit(OpCodes.Stloc, 4);
				}
				else
				{
					ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: RadiusHook Failed!");
				}
			};
			<>c.<>9__35_0 = val;
			obj = (object)val;
		}
		GlobalEventManager.OnHitAll += (Manipulator)obj;
	}

	private static void DamageHook()
	{
		//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
		object obj = <>c.<>9__36_0;
		if (obj == null)
		{
			Manipulator val = delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				//IL_004d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0080: Unknown result type (might be due to invalid IL or missing references)
				ILCursor val2 = new ILCursor(il);
				if (val2.TryGotoNext(new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchStloc(x, 5)
				}))
				{
					val2.Index += 1;
					val2.Emit(OpCodes.Ldloc, 3);
					val2.EmitDelegate<Func<int, float>>((Func<int, float>)((int count) => BaseDamage.Value + StackDamage.Value * (float)(count - 1)));
					val2.Emit(OpCodes.Stloc, 5);
				}
				else
				{
					ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: DamageHook Failed!");
				}
			};
			<>c.<>9__36_0 = val;
			obj = (object)val;
		}
		GlobalEventManager.OnHitAll += (Manipulator)obj;
	}

	private static void FalloffHook()
	{
		//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
		object obj = <>c.<>9__37_0;
		if (obj == null)
		{
			Manipulator val = delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				ILCursor val2 = new ILCursor(il);
				if (val2.TryGotoNext(new Func<Instruction, bool>[2]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, 4),
					(Instruction x) => ILPatternMatchingExt.MatchStfld(x, typeof(BlastAttack).GetField("radius"))
				}))
				{
					int index = val2.Index;
					if (val2.TryGotoNext(new Func<Instruction, bool>[1]
					{
						(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, (MethodBase)typeof(BlastAttack).GetMethod("Fire"))
					}))
					{
						int num = val2.Index - index;
						if (num <= 50)
						{
							val2.EmitDelegate<Func<BlastAttack, BlastAttack>>((Func<BlastAttack, BlastAttack>)delegate(BlastAttack blastAttack)
							{
								//IL_001e: Unknown result type (might be due to invalid IL or missing references)
								int value = DamageFalloff.Value;
								if (value > 0 && value < 3)
								{
									blastAttack.falloffModel = (FalloffModel)value;
								}
								return blastAttack;
							});
						}
						else
						{
							ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: FalloffHook Failed! - BlastAttack.Fire Offset [" + num + "]");
						}
					}
					else
					{
						ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: FalloffHook Failed!");
					}
				}
				else
				{
					ZetItemTweaksPlugin.LogWarn(itemIdentifier + " :: FalloffHook:FindRadius Failed!");
				}
			};
			<>c.<>9__37_0 = val;
			obj = (object)val;
		}
		GlobalEventManager.OnHitAll += (Manipulator)obj;
	}
}
public static class CautiousSlug
{
	public static List<string> autoCompatList = new List<string> { "com.RiskyLives.RiskyMod" };

	public static string itemIdentifier = "CautiousSlug";

	public static bool appliedChanges = false;

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

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

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

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

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

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

	internal static void Init()
	{
		SetupConfig();
		if (EnableChanges.Value > 0)
		{
			ZetItemTweaksPlugin.OnLateSetup = (Action)Delegate.Combine(ZetItemTweaksPlugin.OnLateSetup, new Action(LateSetup));
		}
	}

	private static void SetupConfig()
	{
		EnableChanges = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "EnableChanges", 1, ZetItemTweaksPlugin.SectionEnableDesc);
		if (ZetItemTweaksPlugin.GenerateOverrideText.Value)
		{
			OverrideText = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "OverrideText", defaultValue: true, "Replace item description text.");
		}
		BaseSafeRegen = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseSafeRegen", 3.2f, "Health regeneration gained while safe from item.");
		StackSafeRegen = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackSafeRegen", 3.2f, "Health regeneration gained while safe from item per stack.");
		BaseSafeRegenFraction = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "BaseSafeRegenFraction", 0f, "Health regeneration fraction gained while safe from item. 0.01 = 1% regeneration.");
		StackSafeRegenFraction = ZetItemTweaksPlugin.ConfigEntry(itemIdentifier, "StackSafeRegenFraction", 0f, "Health regeneration fraction gained while safe from item per stack.");
	}

	private static void LateSetup()
	{
		if (ZetItemTweaksPlugin.ProceedChanges(itemIdentifier, EnableChanges.Value, autoCompatList))
		{
			if (!ZetItemTweaksPlugin.GenerateOverrideText.Value || OverrideText.Value)
			{
				ZetItemTweaksPlugin.targetLanguage = "default";
				ZetItemTweaksPlugin.RegisterFragment("SAFE_REGENERATION", "\nIncreases <style=cIsHealing>health regeneration</style> by {0} while out of danger.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_HEALWHILESAFE_DESC", DescriptionText());
				ZetItemTweaksPlugin.targetLanguage = "pt-BR";
				ZetItemTweaksPlugin.RegisterFragment("SAFE_REGENERATION", "\nAumenta a <style=cIsHealing>regeneração de saúde</style> em {0} enquanto fora de perigo.");
				ZetItemTweaksPlugin.RegisterToken("ITEM_HEALWHILESAFE_DESC", DescriptionText());
				ZetItemTweaksPlugin.targetLanguage = "";
			}
			appliedChanges = true;
		}
	}

	private static string DescriptionText()
	{
		string text = "";
		if (BaseSafeRegenFraction.Value > 0f)
		{
			text += string.Format(ZetItemTweaksPlugin.TextFragment("SAFE_REGENERATION", trim: true), ZetItemTweaksPlugin.ScalingText(BaseSafeRegenFraction.Value, StackSafeRegenFraction.Value, "percentregen", "cIsHealing"));
		}
		if (BaseSafeRegen.Value > 0f)
		{
			if (text != "")
			{
				text += "\n";
			}
			text += string.Format(ZetItemTweaksPlugin.TextFragment("SAFE_REGENERATION", trim: true), ZetItemTweaksPlugin.ScalingText(BaseSafeRegen.Value, StackSafeRegen.Value, "flatregen", "cIsHealing"));
		}
		if (text == "")
		{
			text += ZetItemTweaksPlugin.TextFragment("CFG_NO_EF