Decompiled source of HIFUAcridTweaks v1.2.1

HIFUAcridTweaks.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using EntityStates.Croco;
using HIFUAcridTweaks.Keywords;
using HIFUAcridTweaks.Misc;
using HIFUAcridTweaks.Skills;
using HarmonyLib;
using IL.EntityStates.Croco;
using IL.RoR2;
using IL.RoR2.Achievements;
using IL.RoR2.Orbs;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.EntityStates.Croco;
using On.RoR2;
using R2API;
using RoR2;
using RoR2.Achievements;
using RoR2.Achievements.Croco;
using RoR2.Orbs;
using RoR2.Projectile;
using RoR2.Skills;
using RoR2.Stats;
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 = ".NET Standard 2.0")]
[assembly: AssemblyCompany("HIFUAcridTweaks")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("HIFUAcridTweaks")]
[assembly: AssemblyTitle("HIFUAcridTweaks")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace HIFUAcridTweaks
{
	public class ConfigManager
	{
		internal static bool ConfigChanged;

		internal static bool VersionChanged;

		public static T HandleConfig<T>(ConfigEntryBase entry, ConfigFile config, string name)
		{
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Expected O, but got Unknown
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Expected O, but got Unknown
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			MethodInfo methodInfo = (from x in typeof(ConfigFile).GetMethods()
				where x.Name == "Bind"
				select x).First();
			methodInfo = methodInfo.MakeGenericMethod(typeof(T));
			object[] parameters = new object[3]
			{
				(object)new ConfigDefinition(Regex.Replace(config.ConfigFilePath, "\\W", "") + " : " + entry.Definition.Section, name),
				entry.DefaultValue,
				(object)new ConfigDescription(entry.Description.Description, (AcceptableValueBase)null, Array.Empty<object>())
			};
			ConfigEntryBase val = (ConfigEntryBase)methodInfo.Invoke(config, parameters);
			if (Main._preVersioning)
			{
				entry.BoxedValue = entry.DefaultValue;
			}
			if (!ConfigEqual(val.DefaultValue, val.BoxedValue) && VersionChanged)
			{
				entry.BoxedValue = entry.DefaultValue;
				val.BoxedValue = val.DefaultValue;
			}
			return default(T);
		}

		private static bool ConfigEqual(object a, object b)
		{
			if (a.Equals(b))
			{
				return true;
			}
			if (float.TryParse(a.ToString(), out var result) && float.TryParse(b.ToString(), out var result2) && (double)Mathf.Abs(result - result2) < 0.0001)
			{
				return true;
			}
			return false;
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("HIFU.HIFUAcridTweaks", "HIFUAcridTweaks", "1.2.0")]
	public class Main : BaseUnityPlugin
	{
		public const string PluginGUID = "HIFU.HIFUAcridTweaks";

		public const string PluginAuthor = "HIFU";

		public const string PluginName = "HIFUAcridTweaks";

		public const string PluginVersion = "1.2.0";

		public static ConfigFile HACTConfig;

		public static ConfigFile HACTBackupConfig;

		public static ManualLogSource HACTLogger;

		public static ModdedDamageType poison = DamageAPI.ReserveDamageType();

		public static ModdedDamageType blight = DamageAPI.ReserveDamageType();

		public static bool _preVersioning = false;

		public static AssetBundle iHateThis;

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

		public static ConfigEntry<string> latestVersion { get; set; }

		public void Awake()
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_019d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0215: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_022b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0230: Unknown result type (might be due to invalid IL or missing references)
			HACTLogger = ((BaseUnityPlugin)this).Logger;
			HACTConfig = ((BaseUnityPlugin)this).Config;
			iHateThis = AssetBundle.LoadFromFile(Assembly.GetExecutingAssembly().Location.Replace("HIFUAcridTweaks.dll", "hifuacridtweaks"));
			HACTBackupConfig = new ConfigFile(Paths.ConfigPath + "\\HIFU.HIFUAcridTweaks.Backup.cfg", true);
			HACTBackupConfig.Bind<string>(": DO NOT MODIFY THIS FILES CONTENTS :", ": DO NOT MODIFY THIS FILES CONTENTS :", ": DO NOT MODIFY THIS FILES CONTENTS :", ": DO NOT MODIFY THIS FILES CONTENTS :");
			enableAutoConfig = HACTConfig.Bind<bool>("Config", "Enable Auto Config Sync", true, "Disabling this would stop HIFUAcridTweaks from syncing config whenever a new version is found.");
			_preVersioning = !((Dictionary<ConfigDefinition, string>)AccessTools.DeclaredPropertyGetter(typeof(ConfigFile), "OrphanedEntries").Invoke(HACTConfig, null)).Keys.Any((ConfigDefinition x) => x.Key == "Latest Version");
			latestVersion = HACTConfig.Bind<string>("Config", "Latest Version", "1.2.0", "DO NOT CHANGE THIS");
			if (enableAutoConfig.Value && (_preVersioning || latestVersion.Value != "1.2.0"))
			{
				latestVersion.Value = "1.2.0";
				ConfigManager.VersionChanged = true;
				HACTLogger.LogInfo((object)"Config Autosync Enabled.");
			}
			GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Croco/CrocoBody.prefab").WaitForCompletion();
			EntityStateMachine val2 = val.AddComponent<EntityStateMachine>();
			val2.customName = "Leap";
			val2.initialStateType = new SerializableEntityStateType(typeof(Idle));
			val2.mainStateType = new SerializableEntityStateType(typeof(Idle));
			SkillDef val3 = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Croco/CrocoLeap.asset").WaitForCompletion();
			val3.activationStateMachineName = "Leap";
			SkillDef val4 = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Croco/CrocoChainableLeap.asset").WaitForCompletion();
			val4.activationStateMachineName = "Leap";
			EntityStateMachine val5 = val.AddComponent<EntityStateMachine>();
			val5.customName = "Neurotoxin";
			val5.initialStateType = new SerializableEntityStateType(typeof(Idle));
			val5.mainStateType = new SerializableEntityStateType(typeof(Idle));
			NetworkStateMachine component = val.GetComponent<NetworkStateMachine>();
			Array.Resize(ref component.stateMachines, component.stateMachines.Length + 2);
			component.stateMachines[component.stateMachines.Length - 2] = val2;
			component.stateMachines[component.stateMachines.Length - 1] = val5;
			IEnumerable<Type> enumerable = from type in Assembly.GetExecutingAssembly().GetTypes()
				where !type.IsAbstract && type.IsSubclassOf(typeof(TweakBase))
				select type;
			HACTLogger.LogInfo((object)"==+----------------==TWEAKS==----------------+==");
			foreach (Type item in enumerable)
			{
				TweakBase tweakBase = (TweakBase)Activator.CreateInstance(item);
				if (ValidateTweak(tweakBase))
				{
					tweakBase.Init();
				}
			}
			IEnumerable<Type> enumerable2 = from type in Assembly.GetExecutingAssembly().GetTypes()
				where !type.IsAbstract && type.IsSubclassOf(typeof(MiscBase))
				select type;
			HACTLogger.LogInfo((object)"==+----------------==MISC==----------------+==");
			foreach (Type item2 in enumerable2)
			{
				MiscBase miscBase = (MiscBase)Activator.CreateInstance(item2);
				if (ValidateMisc(miscBase))
				{
					miscBase.Init();
				}
			}
			HIFUAcridTweaks.Keywords.Keywords.Init();
		}

		public bool ValidateTweak(TweakBase tb)
		{
			if (!tb.DoesNotKillTheMod)
			{
				return true;
			}
			if (tb.isEnabled && ((BaseUnityPlugin)this).Config.Bind<bool>(tb.Name, "Enable?", true, "Vanilla is false").Value)
			{
				return true;
			}
			return false;
		}

		public bool ValidateMisc(MiscBase mb)
		{
			if (!mb.DoesNotKillTheMod)
			{
				return true;
			}
			if (mb.isEnabled && ((BaseUnityPlugin)this).Config.Bind<bool>(mb.Name, "Enable?", true, "Vanilla is false").Value)
			{
				return true;
			}
			return false;
		}

		private void WITHINDESTRUCTIONMYFUCKINGBELOVED()
		{
		}
	}
	public abstract class MiscBase
	{
		public abstract string Name { get; }

		public virtual bool isEnabled { get; } = true;


		public abstract bool DoesNotKillTheMod { get; }

		public T ConfigOption<T>(T value, string name, string description)
		{
			ConfigEntry<T> val = Main.HACTConfig.Bind<T>(Name, name, value, description);
			ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HACTBackupConfig, name);
			return val.Value;
		}

		public abstract void Hooks();

		public string d(float f)
		{
			return f * 100f + "%";
		}

		public virtual void Init()
		{
			Hooks();
			Main.HACTLogger.LogInfo((object)("Added " + Name));
		}
	}
	public abstract class MiscBase<T> : MiscBase where T : MiscBase<T>
	{
		public static T instance { get; set; }

		public MiscBase()
		{
			if (instance != null)
			{
				throw new InvalidOperationException("Singleton class " + typeof(T).Name + " was instantiated twice");
			}
			instance = this as T;
		}
	}
	public abstract class TweakBase
	{
		public abstract string Name { get; }

		public abstract string SkillToken { get; }

		public abstract string DescText { get; }

		public virtual bool isEnabled { get; } = true;


		public abstract bool DoesNotKillTheMod { get; }

		public T ConfigOption<T>(T value, string name, string description)
		{
			ConfigEntry<T> val = Main.HACTConfig.Bind<T>(Name, name, value, description);
			ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HACTBackupConfig, name);
			return val.Value;
		}

		public abstract void Hooks();

		public string d(float f)
		{
			return f * 100f + "%";
		}

		public virtual void Init()
		{
			Hooks();
			string text = "CROCO_" + SkillToken.ToUpper() + "_DESCRIPTION";
			LanguageAPI.Add(text, DescText);
			Main.HACTLogger.LogInfo((object)("Added " + Name));
		}
	}
	public abstract class TweakBase<T> : TweakBase where T : TweakBase<T>
	{
		public static T instance { get; set; }

		public TweakBase()
		{
			if (instance != null)
			{
				throw new InvalidOperationException("Singleton class " + typeof(T).Name + " was instantiated twice");
			}
			instance = this as T;
		}
	}
}
namespace HIFUAcridTweaks.Skills
{
	public class Blight : TweakBase
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static CustomDotBehaviour <>9__13_0;

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

			public static Func<int, int> <>9__16_0;

			internal void <Init>b__13_0(DotController self, DotStack dotStack)
			{
				GameObject attackerObject = dotStack.attackerObject;
				CharacterBody val = ((attackerObject != null) ? attackerObject.GetComponent<CharacterBody>() : null);
				dotStack.damage = val.damage * damagePerSecond * 0.2f;
			}

			internal bool <GlobalEventManager_OnHitEnemy>b__16_1(Instruction x)
			{
				return ILPatternMatchingExt.MatchLdcI4(x, 1048576);
			}

			internal int <GlobalEventManager_OnHitEnemy>b__16_0(int useless)
			{
				return 0;
			}
		}

		public static float duration;

		public static float damagePerSecond;

		public static BuffDef blight;

		public static DotDef blightDef;

		public static DotIndex blightIndex;

		public override bool DoesNotKillTheMod => false;

		public override string Name => "Passive : Blight";

		public override string SkillToken => "passive_alt";

		public override string DescText => "<style=cArtifact>Blighted</style> attacks apply a stacking damage-over-time.";

		public override void Init()
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Expected O, but got Unknown
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Expected O, but got Unknown
			blight = ScriptableObject.CreateInstance<BuffDef>();
			blight.isDebuff = true;
			blight.isCooldown = false;
			blight.canStack = true;
			blight.isHidden = false;
			blight.iconSprite = Addressables.LoadAssetAsync<BuffDef>((object)"RoR2/Base/Croco/bdBlight.asset").WaitForCompletion().iconSprite;
			blight.buffColor = Color32.op_Implicit(new Color32((byte)177, (byte)56, (byte)127, byte.MaxValue));
			((Object)blight).name = "Blight";
			ContentAddition.AddBuffDef(blight);
			duration = ConfigOption(3f, "Duration", "Vanilla is 5");
			damagePerSecond = ConfigOption(1.1f, "Base Damage Per Second", "Decimal. Vanilla is 0.6");
			blightDef = new DotDef
			{
				associatedBuff = blight,
				damageCoefficient = 1f,
				damageColorIndex = (DamageColorIndex)9,
				interval = 0.2f
			};
			object obj = <>c.<>9__13_0;
			if (obj == null)
			{
				CustomDotBehaviour val = delegate(DotController self, DotStack dotStack)
				{
					GameObject attackerObject = dotStack.attackerObject;
					CharacterBody val3 = ((attackerObject != null) ? attackerObject.GetComponent<CharacterBody>() : null);
					dotStack.damage = val3.damage * damagePerSecond * 0.2f;
				};
				<>c.<>9__13_0 = val;
				obj = (object)val;
			}
			CustomDotBehaviour val2 = (CustomDotBehaviour)obj;
			blightIndex = DotAPI.RegisterDotDef(blightDef, val2, (CustomDotVisual)null);
			base.Init();
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			GlobalEventManager.OnHitEnemy += new Manipulator(GlobalEventManager_OnHitEnemy);
			GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
		}

		private void GlobalEventManager_onServerDamageDealt(DamageReport report)
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			DamageInfo damageInfo = report.damageInfo;
			GameObject attacker = report.attacker;
			if (Object.op_Implicit((Object)(object)attacker))
			{
				HealthComponent victim = report.victim;
				if (Object.op_Implicit((Object)(object)victim) && DamageAPI.HasModdedDamageType(damageInfo, Main.blight))
				{
					InflictDotInfo val = default(InflictDotInfo);
					val.victimObject = ((Component)victim).gameObject;
					val.attackerObject = attacker;
					val.totalDamage = null;
					val.dotIndex = blightIndex;
					val.duration = duration;
					val.damageMultiplier = 1f;
					val.maxStacksFromAttacker = uint.MaxValue;
					InflictDotInfo val2 = val;
					DotController.InflictDot(ref val2);
				}
			}
		}

		private void GlobalEventManager_OnHitEnemy(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((MoveType)0, new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 1048576)
			}))
			{
				int index = val.Index;
				val.Index = index + 1;
				val.EmitDelegate<Func<int, int>>((Func<int, int>)((int useless) => 0));
			}
			else
			{
				Main.HACTLogger.LogError((object)"Failed to apply Blight Deletion hook");
			}
		}
	}
	internal class CausticLeap : TweakBase
	{
		public static float damage;

		public static float poolDamage;

		public static float cooldown;

		public override bool DoesNotKillTheMod => true;

		public override string Name => "Utility : Caustic Leap";

		public override string SkillToken => "utility";

		public override string DescText => "<style=cArtifact>Blighted</style>. <style=cIsDamage>Stunning</style>. Leap in the air, dealing <style=cIsDamage>" + d(damage) + " damage</style>. Leave acid that deals <style=cIsDamage>" + d(poolDamage) + " damage</style>.";

		public override void Init()
		{
			damage = ConfigOption(2.6f, "Damage", "Decimal. Vanilla is 3.2");
			poolDamage = ConfigOption(2f, "Pool Damage", "Decimal. Vanilla is 1");
			cooldown = ConfigOption(6f, "Cooldown", "Vanilla is 6");
			base.Init();
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			BaseLeap.OnEnter += new hook_OnEnter(BaseLeap_OnEnter);
			BaseLeap.DropAcidPoolAuthority += new Manipulator(BaseLeap_DropAcidPoolAuthority);
			Changes();
		}

		private void BaseLeap_DropAcidPoolAuthority(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdfld<BaseState>(x, "damageStat")
			}))
			{
				val.Emit(OpCodes.Ldc_R4, poolDamage);
				val.Emit(OpCodes.Mul);
			}
			else
			{
				Main.HACTLogger.LogError((object)"Failed to apply Caustic Leap Pool Damage hook");
			}
		}

		private void BaseLeap_OnEnter(orig_OnEnter orig, BaseLeap self)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			if (!(self is ChainableLeap))
			{
				self.blastDamageCoefficient = damage;
				self.blastForce = 0f;
				self.blastBonusForce = Vector3.zero;
			}
			orig.Invoke(self);
		}

		private void Changes()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Croco/CrocoLeap.asset").WaitForCompletion();
			val.baseRechargeInterval = cooldown;
			val.keywordTokens = new string[2] { "HAT_BLIGHT", "KEYWORD_STUNNING" };
		}
	}
	internal class Epidemic : TweakBase
	{
		public static float damage;

		public static float cooldown;

		public static int maxTargets;

		public static float maxDistance;

		public static float shareDuration;

		public static ModdedDamageType shared = DamageAPI.ReserveDamageType();

		public static BuffDef shareDamage;

		public static float sharedPercent;

		public static ProcType sharedMask = (ProcType)12561269;

		public override bool DoesNotKillTheMod => true;

		public override string Name => "Special : Epidemic";

		public override string SkillToken => "special";

		public override string DescText => "<style=cArtifact>Blighted</style>. Release a deadly disease that deals <style=cIsDamage>" + d(damage) + " damage</style> and spreads up to <style=cIsDamage>" + maxTargets + "</style> times. All enemies hit <style=cIsDamage>share " + d(sharedPercent) + " TOTAL damage taken</style> for <style=cIsDamage>" + shareDuration + "s</style>.";

		public override void Init()
		{
			shareDamage = ScriptableObject.CreateInstance<BuffDef>();
			shareDamage.isDebuff = true;
			shareDamage.canStack = false;
			shareDamage.isCooldown = false;
			shareDamage.isHidden = true;
			((Object)shareDamage).name = "Epidemic Shared Damage";
			ContentAddition.AddBuffDef(shareDamage);
			damage = ConfigOption(2.4f, "Damage", "Decimal. Vanilla is 1");
			cooldown = ConfigOption(10f, "Cooldown", "Vanilla is 10");
			maxTargets = ConfigOption(4, "Max Targets", "Vanilla is 1048577");
			maxDistance = ConfigOption(35f, "Max Range", "Vanilla is 30");
			shareDuration = ConfigOption(5f, "Damage Sharing Duration", "");
			sharedPercent = ConfigOption(0.3f, "Damage Sharing Percent", "Decimal.");
			base.Init();
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			LightningOrb.Begin += new Manipulator(LightningOrb_Begin);
			FireSpit.OnEnter += new hook_OnEnter(FireSpit_OnEnter);
			HealthComponent.TakeDamage += new hook_TakeDamage(HealthComponent_TakeDamage);
			Changes();
		}

		private void HealthComponent_TakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo info)
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Expected O, but got Unknown
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: Unknown result type (might be due to invalid IL or missing references)
			//IL_0207: Unknown result type (might be due to invalid IL or missing references)
			//IL_020c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0211: Unknown result type (might be due to invalid IL or missing references)
			//IL_021c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			//IL_023b: Expected O, but got Unknown
			//IL_023d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0245: Unknown result type (might be due to invalid IL or missing references)
			//IL_0252: Unknown result type (might be due to invalid IL or missing references)
			//IL_0254: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, info);
			if (!NetworkServer.active || !Object.op_Implicit((Object)(object)info.attacker) || !Object.op_Implicit((Object)(object)info.attacker.GetComponent<TeamComponent>()) || (DamageAPI.HasModdedDamageType(info, Main.poison) && DamageAPI.HasModdedDamageType(info, Main.blight)) || !(info.procCoefficient > 0f))
			{
				return;
			}
			if (DamageAPI.HasModdedDamageType(info, shared))
			{
				self.body.AddTimedBuffAuthority(shareDamage.buffIndex, shareDuration);
			}
			if (!self.body.HasBuff(shareDamage) || ((ProcChainMask)(ref info.procChainMask)).HasProc(sharedMask))
			{
				return;
			}
			SphereSearch val = new SphereSearch
			{
				origin = info.position,
				radius = maxDistance * 3f,
				mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask,
				queryTriggerInteraction = (QueryTriggerInteraction)1
			};
			TeamIndex teamIndex = info.attacker.GetComponent<TeamComponent>().teamIndex;
			val.RefreshCandidates();
			val.FilterCandidatesByDistinctHurtBoxEntities();
			HurtBox[] hurtBoxes = val.GetHurtBoxes();
			HurtBox[] array = hurtBoxes;
			foreach (HurtBox val2 in array)
			{
				if (val2.teamIndex != teamIndex && Object.op_Implicit((Object)(object)val2.healthComponent) && (Object)(object)val2.healthComponent != (Object)(object)self && val2.healthComponent.body.HasBuff(shareDamage))
				{
					LightningOrb val3 = new LightningOrb
					{
						lightningType = (LightningType)2,
						canBounceOnSameTarget = false,
						bouncesRemaining = 1,
						damageColorIndex = (DamageColorIndex)8,
						damageValue = info.damage * sharedPercent,
						damageCoefficientPerBounce = 1f,
						attacker = info.attacker,
						isCrit = info.crit,
						target = val2,
						teamIndex = teamIndex,
						targetsToFindPerBounce = 1,
						speed = 20f,
						origin = info.position,
						procCoefficient = 0f,
						bouncedObjects = new List<HealthComponent>(),
						duration = maxDistance * 3f
					};
					ProcChainMask procChainMask = default(ProcChainMask);
					((ProcChainMask)(ref procChainMask)).AddProc(sharedMask);
					val3.procChainMask = procChainMask;
					OrbManager.instance.AddOrb((Orb)(object)val3);
				}
			}
		}

		private void FireSpit_OnEnter(orig_OnEnter orig, FireSpit self)
		{
			self.baseDuration = 0.3f;
			if (self is FireDiseaseProjectile)
			{
				self.damageCoefficient = damage;
			}
			orig.Invoke(self);
		}

		private void LightningOrb_Begin(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);
			int num = default(int);
			if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[4]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 0.6f),
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Orb>(x, "set_duration"),
				(Instruction x) => ILPatternMatchingExt.MatchLdarg(x, ref num),
				(Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 2)
			}))
			{
				val.Next.Operand = 0.25f;
				val.Index += 4;
				val.EmitDelegate<Func<int, int>>((Func<int, int>)((int useless) => 1));
			}
			else
			{
				Main.HACTLogger.LogError((object)"Failed to apply Epidemic Un-J hook");
			}
		}

		private void Changes()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Croco/CrocoDisease.asset").WaitForCompletion();
			val.baseRechargeInterval = cooldown;
			val.keywordTokens = new string[1] { "HAT_BLIGHT" };
			GameObject val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Croco/CrocoDiseaseProjectile.prefab").WaitForCompletion();
			ModdedDamageTypeHolderComponent val3 = val2.AddComponent<ModdedDamageTypeHolderComponent>();
			val3.Add(Main.blight);
			val3.Add(shared);
			ProjectileSimple component = val2.GetComponent<ProjectileSimple>();
			component.lifetime = 10f;
			component.desiredForwardSpeed = 100f;
			ProjectileProximityBeamController component2 = val2.GetComponent<ProjectileProximityBeamController>();
			component2.attackRange = maxDistance;
			component2.bounces = maxTargets;
			Rigidbody component3 = val2.GetComponent<Rigidbody>();
			component3.useGravity = true;
			component3.collisionDetectionMode = (CollisionDetectionMode)1;
			component3.freezeRotation = true;
			AntiGravityForce val4 = val2.AddComponent<AntiGravityForce>();
			val4.rb = val2.GetComponent<Rigidbody>();
			val4.antiGravityCoefficient = 0.25f;
		}
	}
	internal class FrenziedLeap : TweakBase
	{
		public static float damage;

		public static float cdr;

		public static float cooldown;

		public static float radius;

		public override bool DoesNotKillTheMod => true;

		public override string Name => "Utility :: Frenzied Leap";

		public override string SkillToken => "utility_alt1";

		public override string DescText => "<style=cIsHealing>Regenerative</style>. <style=cIsDamage>Stunning</style>. Leap in the air, dealing <style=cIsDamage>" + d(damage) + " damage</style> in a small area.";

		public override void Init()
		{
			damage = ConfigOption(6.5f, "Damage", "Decimal. Vanilla is 5.5");
			cooldown = ConfigOption(6f, "Cooldown", "Vanilla is 10");
			radius = ConfigOption(6.5f, "Area of Effect", "Vanilla is 10");
			base.Init();
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			BaseLeap.OnEnter += new hook_OnEnter(BaseLeap_OnEnter);
			BaseLeap.OnExit += new hook_OnExit(BaseLeap_OnExit);
			BaseLeap.DetonateAuthority += new hook_DetonateAuthority(BaseLeap_DetonateAuthority);
			ChainableLeap.DoImpactAuthority += new hook_DoImpactAuthority(ChainableLeap_DoImpactAuthority);
			Changes();
		}

		private Result BaseLeap_DetonateAuthority(orig_DetonateAuthority orig, BaseLeap self)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Expected O, but got Unknown
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			Vector3 footPosition = ((EntityState)self).characterBody.footPosition;
			EffectManager.SpawnEffect(self.blastEffectPrefab, new EffectData
			{
				origin = footPosition,
				scale = radius
			}, true);
			BlastAttack val = new BlastAttack
			{
				attacker = ((EntityState)self).gameObject,
				baseDamage = ((BaseState)self).damageStat * self.blastDamageCoefficient,
				baseForce = 0f,
				bonusForce = Vector3.zero,
				crit = self.isCritAuthority,
				falloffModel = (FalloffModel)0,
				procCoefficient = BaseLeap.blastProcCoefficient,
				radius = radius,
				damageType = (DamageType)32,
				position = footPosition,
				attackerFiltering = (AttackerFiltering)2,
				impactEffect = EffectCatalog.FindEffectIndexFromPrefab(self.blastImpactEffectPrefab),
				teamIndex = ((EntityState)self).teamComponent.teamIndex
			};
			if (self is ChainableLeap)
			{
				PassiveController component = ((EntityState)self).GetComponent<PassiveController>();
				if ((Object)(object)component != (Object)null)
				{
					string currentPassive = component.currentPassive;
					string text = currentPassive;
					if (text == "HAT_FRENZY_NAME")
					{
						DamageAPI.AddModdedDamageType(val, Passives.frenzy);
					}
					else
					{
						DamageAPI.AddModdedDamageType(val, Passives.regen);
					}
				}
			}
			else
			{
				DamageAPI.AddModdedDamageType(val, Main.blight);
			}
			return val.Fire();
		}

		private void BaseLeap_OnExit(orig_OnExit orig, BaseLeap self)
		{
			orig.Invoke(self);
			((EntityState)self).characterBody.isSprinting = true;
		}

		private void ChainableLeap_DoImpactAuthority(orig_DoImpactAuthority orig, ChainableLeap self)
		{
			ChainableLeap.refundPerHit = 0f;
			orig.Invoke(self);
		}

		private void BaseLeap_OnEnter(orig_OnEnter orig, BaseLeap self)
		{
			if (self is ChainableLeap)
			{
				self.blastDamageCoefficient = damage;
			}
			orig.Invoke(self);
		}

		private void Changes()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Croco/CrocoChainableLeap.asset").WaitForCompletion();
			val.baseRechargeInterval = cooldown;
			val.keywordTokens = new string[2] { "KEYWORD_RAPID_REGEN", "KEYWORD_STUNNING" };
		}
	}
	internal class Neurotoxin : TweakBase
	{
		public static float damage;

		public static float cooldown;

		public static float aoe;

		public override bool DoesNotKillTheMod => true;

		public override string Name => "Secondary : Neurotoxin";

		public override string SkillToken => "secondary";

		public override string DescText => "<style=cIsUtility>Agile</style>. <style=cArtifact>Blighted</style>. Spit toxic bile for <style=cIsDamage>" + d(damage) + " damage</style>.";

		public override void Init()
		{
			damage = ConfigOption(2.6f, "Damage", "Decimal. Vanilla is 2.4");
			cooldown = ConfigOption(3f, "Cooldown", "Vanilla is 2");
			aoe = ConfigOption(8f, "Area of Effect", "Vanilla is 3");
			base.Init();
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			FireSpit.OnEnter += new hook_OnEnter(FireSpit_OnEnter1);
			FireSpit.OnEnter += new Manipulator(FireSpit_OnEnter);
			Changes();
		}

		private void FireSpit_OnEnter1(orig_OnEnter orig, FireSpit self)
		{
			self.baseDuration = 0.3f;
			if (!(self is FireDiseaseProjectile))
			{
				self.damageCoefficient = damage;
			}
			orig.Invoke(self);
		}

		private void FireSpit_OnEnter(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);
			int num = default(int);
			if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[2]
			{
				(Instruction x) => ILPatternMatchingExt.MatchStfld(x, "RoR2.Projectile.FireProjectileInfo", "damage"),
				(Instruction x) => ILPatternMatchingExt.MatchLdloca(x, ref num)
			}))
			{
				val.Index += 3;
				val.EmitDelegate<Func<int, int>>((Func<int, int>)((int useless) => 0));
			}
			else
			{
				Main.HACTLogger.LogError((object)"Failed to apply Spit Damage Type hook");
			}
		}

		private void Changes()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: 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)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Expected O, but got Unknown
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_020d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: Unknown result type (might be due to invalid IL or missing references)
			//IL_0228: Unknown result type (might be due to invalid IL or missing references)
			//IL_0245: Unknown result type (might be due to invalid IL or missing references)
			//IL_024a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0250: Unknown result type (might be due to invalid IL or missing references)
			//IL_026d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0272: Unknown result type (might be due to invalid IL or missing references)
			//IL_028d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0292: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02be: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cd: Expected O, but got Unknown
			//IL_02c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_030e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0313: Unknown result type (might be due to invalid IL or missing references)
			//IL_031c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0333: Unknown result type (might be due to invalid IL or missing references)
			//IL_0338: Unknown result type (might be due to invalid IL or missing references)
			//IL_0353: Unknown result type (might be due to invalid IL or missing references)
			//IL_0358: Unknown result type (might be due to invalid IL or missing references)
			//IL_0369: Unknown result type (might be due to invalid IL or missing references)
			//IL_036e: Unknown result type (might be due to invalid IL or missing references)
			//IL_037f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0384: Unknown result type (might be due to invalid IL or missing references)
			//IL_0389: Unknown result type (might be due to invalid IL or missing references)
			//IL_0393: Expected O, but got Unknown
			//IL_038e: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_03aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b3: Expected O, but got Unknown
			//IL_03bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_03cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_040f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0414: Unknown result type (might be due to invalid IL or missing references)
			//IL_0425: Unknown result type (might be due to invalid IL or missing references)
			//IL_042a: Unknown result type (might be due to invalid IL or missing references)
			//IL_043b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0440: Unknown result type (might be due to invalid IL or missing references)
			//IL_044f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0465: Unknown result type (might be due to invalid IL or missing references)
			SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Croco/CrocoSpit.asset").WaitForCompletion();
			val.baseRechargeInterval = cooldown;
			val.keywordTokens = new string[1] { "HAT_BLIGHT" };
			GameObject val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Croco/CrocoSpit.prefab").WaitForCompletion();
			ModdedDamageTypeHolderComponent val3 = val2.AddComponent<ModdedDamageTypeHolderComponent>();
			val3.Add(Main.blight);
			val2.transform.localScale = new Vector3(0.1f, 0.1f, 1f);
			GameObject val4 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Croco/CrocoSpitGhost.prefab").WaitForCompletion();
			val4.transform.localScale = new Vector3(2f, 2f, 2f);
			ProjectileSimple component = val2.GetComponent<ProjectileSimple>();
			component.desiredForwardSpeed = 100f;
			component.lifetime = 10f;
			Rigidbody component2 = val2.GetComponent<Rigidbody>();
			component2.useGravity = true;
			component2.collisionDetectionMode = (CollisionDetectionMode)1;
			component2.freezeRotation = true;
			AntiGravityForce val5 = val2.AddComponent<AntiGravityForce>();
			val5.rb = val2.GetComponent<Rigidbody>();
			val5.antiGravityCoefficient = 0.25f;
			ProjectileImpactExplosion component3 = val2.GetComponent<ProjectileImpactExplosion>();
			((ProjectileExplosion)component3).blastRadius = aoe;
			component3.lifetime = 10f;
			GameObject val6 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Croco/CrocoDiseaseImpactEffect.prefab").WaitForCompletion();
			val6.transform.localScale = new Vector3(aoe, aoe, aoe);
			MainModule main = ((Component)val6.transform.GetChild(1)).GetComponent<ParticleSystem>().main;
			((MainModule)(ref main)).startLifetime = MinMaxCurve.op_Implicit(0.33f);
			Gradient val7 = new Gradient();
			val7.SetKeys((GradientColorKey[])(object)new GradientColorKey[3]
			{
				new GradientColorKey(Color.white, 0f),
				new GradientColorKey(Color.white, 0.165f),
				new GradientColorKey(Color.black, 0.33f)
			}, (GradientAlphaKey[])(object)new GradientAlphaKey[3]
			{
				new GradientAlphaKey(0f, 0f),
				new GradientAlphaKey(1f, 0.165f),
				new GradientAlphaKey(0f, 0.33f)
			});
			ColorOverLifetimeModule colorOverLifetime = ((Component)val6.transform.GetChild(1)).GetComponent<ParticleSystem>().colorOverLifetime;
			((ColorOverLifetimeModule)(ref colorOverLifetime)).color = MinMaxGradient.op_Implicit(val7);
			SizeOverLifetimeModule sizeOverLifetime = ((Component)val6.transform.GetChild(1)).GetComponent<ParticleSystem>().sizeOverLifetime;
			((SizeOverLifetimeModule)(ref sizeOverLifetime)).size = new MinMaxCurve(1f, new AnimationCurve((Keyframe[])(object)new Keyframe[3]
			{
				new Keyframe(0f, 0f),
				new Keyframe(1f, 0.165f),
				new Keyframe(0f, 0.33f)
			}));
			ParticleSystemRenderer component4 = ((Component)val6.transform.GetChild(2)).GetComponent<ParticleSystemRenderer>();
			component4.mesh = Addressables.LoadAssetAsync<Mesh>((object)"RoR2/Base/Common/VFX/mdlVFXDonut2.fbx").WaitForCompletion();
			MainModule main2 = ((Component)component4).gameObject.GetComponent<ParticleSystem>().main;
			((MainModule)(ref main2)).startLifetime = MinMaxCurve.op_Implicit(0.5f);
			SizeOverLifetimeModule sizeOverLifetime2 = ((Component)component4).gameObject.GetComponent<ParticleSystem>().sizeOverLifetime;
			((SizeOverLifetimeModule)(ref sizeOverLifetime2)).size = new MinMaxCurve(1f, new AnimationCurve((Keyframe[])(object)new Keyframe[3]
			{
				new Keyframe(0f, 0f),
				new Keyframe(1f, 0.1f),
				new Keyframe(0f, 0.5f)
			}));
			ColorOverLifetimeModule colorOverLifetime2 = ((Component)component4).gameObject.GetComponent<ParticleSystem>().colorOverLifetime;
			Gradient val8 = new Gradient();
			val8.SetKeys((GradientColorKey[])(object)new GradientColorKey[3]
			{
				new GradientColorKey(Color.black, 0f),
				new GradientColorKey(Color.white, 0.1f),
				new GradientColorKey(Color.black, 0.5f)
			}, (GradientAlphaKey[])(object)new GradientAlphaKey[3]
			{
				new GradientAlphaKey(0f, 0f),
				new GradientAlphaKey(1f, 0.1f),
				new GradientAlphaKey(0f, 0.5f)
			});
			((ColorOverLifetimeModule)(ref colorOverLifetime2)).color = MinMaxGradient.op_Implicit(val8);
			ProjectileDamage component5 = val2.GetComponent<ProjectileDamage>();
			component5.damageType = (DamageType)0;
		}
	}
	internal class PassiveController : MonoBehaviour
	{
		public string currentPassive;

		public static SkillFamily passiveFamily = Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/Base/Croco/CrocoBodyPassiveFamily.asset").WaitForCompletion();

		public void Start()
		{
			GenericSkill val = (from x in ((Component)this).gameObject.GetComponents<GenericSkill>()
				where (Object)(object)x.skillFamily == (Object)(object)passiveFamily
				select x).First();
			currentPassive = val.skillNameToken;
		}
	}
	public class Poison : TweakBase
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static CustomDotBehaviour <>9__15_0;

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

			public static Func<int, int> <>9__18_0;

			internal void <Init>b__15_0(DotController self, DotStack dotStack)
			{
				GameObject attackerObject = dotStack.attackerObject;
				CharacterBody val = ((attackerObject != null) ? attackerObject.GetComponent<CharacterBody>() : null);
				dotStack.damage = Mathf.Min(Mathf.Max(Object.op_Implicit((Object)(object)self.victimHealthComponent) ? (self.victimHealthComponent.fullCombinedHealth * percentDamagePerSecond * 0.25f) : 0f, val.damage * getReal * 0.25f), val.damage * dpsCap * 0.25f);
			}

			internal bool <GlobalEventManager_OnHitEnemy>b__18_1(Instruction x)
			{
				return ILPatternMatchingExt.MatchLdcI4(x, 4096);
			}

			internal int <GlobalEventManager_OnHitEnemy>b__18_0(int useless)
			{
				return 0;
			}
		}

		public static float duration;

		public static float percentDamagePerSecond;

		public static float dpsCap;

		public static float getReal;

		public static BuffDef poison;

		public static DotDef poisonDef;

		public static DotIndex poisonIndex;

		public override bool DoesNotKillTheMod => false;

		public override string Name => "Passive : Poison";

		public override string SkillToken => "passive";

		public override string DescText => "<style=cIsHealing>Poisonous</style> attacks apply a powerful damage-over-time.";

		public override void Init()
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Expected O, but got Unknown
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Expected O, but got Unknown
			poison = ScriptableObject.CreateInstance<BuffDef>();
			poison.isDebuff = true;
			poison.isCooldown = false;
			poison.canStack = false;
			poison.isHidden = false;
			poison.iconSprite = Addressables.LoadAssetAsync<BuffDef>((object)"RoR2/Base/Croco/bdPoisoned.asset").WaitForCompletion().iconSprite;
			poison.buffColor = Color32.op_Implicit(new Color32((byte)201, (byte)242, (byte)77, byte.MaxValue));
			((Object)poison).name = "Poison";
			ContentAddition.AddBuffDef(poison);
			duration = ConfigOption(3f, "Duration", "Vanilla is 10");
			percentDamagePerSecond = ConfigOption(0.015f, "Percent Max Health Damage Per Second", "Decimal. Vanilla is 0.01");
			dpsCap = ConfigOption(50f, "Maximum Base Damage Per Second", "Decimal. Vanilla is 50");
			getReal = ConfigOption(1f, "Minimum Base Damage Per Second", "Decimal. Vanilla is 1");
			poisonDef = new DotDef
			{
				associatedBuff = poison,
				damageCoefficient = 1f,
				damageColorIndex = (DamageColorIndex)4,
				interval = 0.25f
			};
			object obj = <>c.<>9__15_0;
			if (obj == null)
			{
				CustomDotBehaviour val = delegate(DotController self, DotStack dotStack)
				{
					GameObject attackerObject = dotStack.attackerObject;
					CharacterBody val3 = ((attackerObject != null) ? attackerObject.GetComponent<CharacterBody>() : null);
					dotStack.damage = Mathf.Min(Mathf.Max(Object.op_Implicit((Object)(object)self.victimHealthComponent) ? (self.victimHealthComponent.fullCombinedHealth * percentDamagePerSecond * 0.25f) : 0f, val3.damage * getReal * 0.25f), val3.damage * dpsCap * 0.25f);
				};
				<>c.<>9__15_0 = val;
				obj = (object)val;
			}
			CustomDotBehaviour val2 = (CustomDotBehaviour)obj;
			poisonIndex = DotAPI.RegisterDotDef(poisonDef, val2, (CustomDotVisual)null);
			base.Init();
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			GlobalEventManager.OnHitEnemy += new Manipulator(GlobalEventManager_OnHitEnemy);
			GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
		}

		private void GlobalEventManager_onServerDamageDealt(DamageReport report)
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			DamageInfo damageInfo = report.damageInfo;
			CharacterBody attackerBody = report.attackerBody;
			if (!Object.op_Implicit((Object)(object)attackerBody))
			{
				return;
			}
			HealthComponent victim = report.victim;
			if (Object.op_Implicit((Object)(object)victim) && DamageAPI.HasModdedDamageType(damageInfo, Main.poison))
			{
				InflictDotInfo val = default(InflictDotInfo);
				val.victimObject = ((Component)victim).gameObject;
				val.attackerObject = ((Component)attackerBody).gameObject;
				val.totalDamage = null;
				val.dotIndex = poisonIndex;
				val.duration = duration;
				val.damageMultiplier = 1f;
				val.maxStacksFromAttacker = 1u;
				InflictDotInfo val2 = val;
				DotController.InflictDot(ref val2);
				CharacterMaster master = attackerBody.master;
				if (Object.op_Implicit((Object)(object)master) && Object.op_Implicit((Object)(object)master.playerStatsComponent))
				{
					master.playerStatsComponent.currentStats.PushStatValue(StatDef.totalCrocoInfectionsInflicted, 1uL);
				}
			}
		}

		private void GlobalEventManager_OnHitEnemy(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((MoveType)0, new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 4096)
			}))
			{
				int index = val.Index;
				val.Index = index + 1;
				val.EmitDelegate<Func<int, int>>((Func<int, int>)((int useless) => 0));
			}
			else
			{
				Main.HACTLogger.LogError((object)"Failed to apply Poison Deletion hook");
			}
		}
	}
	internal class RavenousBite : TweakBase
	{
		public static float damage;

		public static float cooldown;

		public override bool DoesNotKillTheMod => true;

		public override string Name => "Secondary :: Ravenous Bite";

		public override string SkillToken => "secondary_alt";

		public override string DescText => "<style=cIsUtility>Agile</style>. <style=cArtifact>Blighted</style>. <style=cIsHealing>Regenerative</style>. Bite an enemy for <style=cIsDamage>" + d(damage) + " damage</style>.";

		public override void Init()
		{
			damage = ConfigOption(4.4f, "Damage", "Decimal. Vanilla is 3.2");
			cooldown = ConfigOption(3f, "Cooldown", "Vanilla is 2");
			base.Init();
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			Bite.OnEnter += new hook_OnEnter(Bite_OnEnter);
			Bite.AuthorityModifyOverlapAttack += new hook_AuthorityModifyOverlapAttack(Bite_AuthorityModifyOverlapAttack);
			Changes();
		}

		private void Bite_OnEnter(orig_OnEnter orig, Bite self)
		{
			((BasicMeleeAttack)self).damageCoefficient = damage;
			orig.Invoke(self);
		}

		private void Bite_AuthorityModifyOverlapAttack(orig_AuthorityModifyOverlapAttack orig, Bite self, OverlapAttack overlapAttack)
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			PassiveController component = ((EntityState)self).GetComponent<PassiveController>();
			if ((Object)(object)component != (Object)null)
			{
				string currentPassive = component.currentPassive;
				string text = currentPassive;
				if (text == "HAT_FRENZY_NAME")
				{
					DamageAPI.AddModdedDamageType(overlapAttack, Passives.frenzy);
				}
				else
				{
					DamageAPI.AddModdedDamageType(overlapAttack, Passives.regen);
				}
			}
			DamageAPI.AddModdedDamageType(overlapAttack, Main.blight);
		}

		private void Changes()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Croco/CrocoBite.asset").WaitForCompletion();
			val.baseRechargeInterval = cooldown;
			val.cancelSprintingOnActivation = false;
			val.keywordTokens = new string[3] { "HAT_BLIGHT", "KEYWORD_AGILE", "KEYWORD_RAPID_REGEN" };
		}
	}
	internal class ViciousWounds : TweakBase
	{
		public static bool disableCancel;

		public static float duration;

		public static float damage;

		public static float lastHitDamage;

		public override bool DoesNotKillTheMod => true;

		public override string Name => "Primary : Vicious Wounds";

		public override string SkillToken => "primary";

		public override string DescText => "Maul an enemy for <style=cIsDamage>" + d(damage) + " damage</style>. Every third hit is <style=cIsHealing>Poisonous</style>, <style=cIsHealing>Regenerative</style> and deals <style=cIsDamage>" + d(lastHitDamage) + " damage</style>.";

		public override void Init()
		{
			disableCancel = ConfigOption(value: true, "Disable M1 Cancel?", "Vanilla is false. For a bit of a backstory, Acrid used to have a choice between dealing more dps and healing with the cancel, now it's straight up better and I can't revert it.");
			duration = ConfigOption(1.25f, "Total Duration", "Vanilla is 1.5");
			damage = ConfigOption(2f, "First And Second Hit Damage", "Decimal. Vanilla is 2");
			lastHitDamage = ConfigOption(4f, "Last Hit Damage", "Decimal. Vanilla is 4");
			base.Init();
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			Slash.OnEnter += new hook_OnEnter(Slash_OnEnter);
			Slash.AuthorityModifyOverlapAttack += new hook_AuthorityModifyOverlapAttack(Slash_AuthorityModifyOverlapAttack);
			Changes();
		}

		private void Slash_AuthorityModifyOverlapAttack(orig_AuthorityModifyOverlapAttack orig, Slash self, OverlapAttack overlapAttack)
		{
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			if (self.isComboFinisher)
			{
				PassiveController component = ((EntityState)self).GetComponent<PassiveController>();
				if ((Object)(object)component != (Object)null)
				{
					string currentPassive = component.currentPassive;
					string text = currentPassive;
					if (text == "HAT_FRENZY_NAME")
					{
						DamageAPI.AddModdedDamageType(overlapAttack, Passives.frenzy);
					}
					else
					{
						DamageAPI.AddModdedDamageType(overlapAttack, Passives.regen);
					}
				}
				DamageAPI.AddModdedDamageType(overlapAttack, Main.poison);
			}
			orig.Invoke(self, overlapAttack);
		}

		private void Slash_OnEnter(orig_OnEnter orig, Slash self)
		{
			((BasicMeleeAttack)self).damageCoefficient = damage;
			Slash.comboFinisherDamageCoefficient = lastHitDamage;
			((BasicMeleeAttack)self).baseDuration = duration;
			((BasicMeleeAttack)self).duration = duration / ((BaseState)self).attackSpeedStat;
			Slash.comboFinisherBaseDurationBeforeInterruptable = duration / 1.5f;
			Slash.baseDurationBeforeInterruptable = duration / 2.7272727f;
			orig.Invoke(self);
		}

		private void Changes()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			SteppedSkillDef val = Addressables.LoadAssetAsync<SteppedSkillDef>((object)"RoR2/Base/Croco/CrocoSlash.asset").WaitForCompletion();
			if (disableCancel)
			{
				((SkillDef)val).canceledFromSprinting = false;
			}
			((SkillDef)val).keywordTokens = new string[2] { "HAT_POISON", "KEYWORD_RAPID_REGEN" };
		}
	}
}
namespace HIFUAcridTweaks.Misc
{
	internal class Achievements : MiscBase
	{
		public static ulong poisonCount;

		public override string Name => "Misc ::::: Achievements";

		public override bool DoesNotKillTheMod => true;

		public override void Init()
		{
			poisonCount = ConfigOption(100uL, "Acrid: Pandemic Poison Requirement Amount", "Vanilla is 1000");
			base.Init();
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			BaseStatMilestoneAchievement.ProgressForAchievement += new Manipulator(BaseStatMilestoneAchievement_ProgressForAchievement);
			BaseStatMilestoneAchievement.Check += new Manipulator(BaseStatMilestoneAchievement_Check);
			Changes();
		}

		private void BaseStatMilestoneAchievement_Check(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<BaseStatMilestoneAchievement>(x, "get_statRequirement")
			}))
			{
				int index = val.Index;
				val.Index = index + 1;
				val.Emit(OpCodes.Ldarg_0);
				val.EmitDelegate<Func<ulong, BaseStatMilestoneAchievement, ulong>>((Func<ulong, BaseStatMilestoneAchievement, ulong>)((ulong orig, BaseStatMilestoneAchievement self) => (self is CrocoTotalInfectionsMilestoneAchievement) ? poisonCount : orig));
			}
			else
			{
				Main.HACTLogger.LogError((object)"Failed to apply Poison Count 2 hook");
			}
		}

		private void BaseStatMilestoneAchievement_ProgressForAchievement(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<BaseStatMilestoneAchievement>(x, "get_statRequirement")
			}))
			{
				int index = val.Index;
				val.Index = index + 1;
				val.Emit(OpCodes.Ldarg_0);
				val.EmitDelegate<Func<ulong, BaseStatMilestoneAchievement, ulong>>((Func<ulong, BaseStatMilestoneAchievement, ulong>)((ulong orig, BaseStatMilestoneAchievement self) => (self is CrocoTotalInfectionsMilestoneAchievement) ? poisonCount : orig));
			}
			else
			{
				Main.HACTLogger.LogError((object)"Failed to apply Poison Count 1 hook");
			}
		}

		private void Changes()
		{
			LanguageAPI.Add("ACHIEVEMENT_CROCOTOTALINFECTIONSMILESTONE_DESCRIPTION", "As Acrid, inflict Poison " + poisonCount + " total times.");
		}
	}
	internal class BaseStats : MiscBase
	{
		public static float baseDamage;

		public static float baseHealth;

		public override string Name => "Misc :: Base Stats";

		public override bool DoesNotKillTheMod => true;

		public override void Init()
		{
			baseDamage = ConfigOption(12f, "Base Damage", "Vanilla is 15");
			baseHealth = ConfigOption(120f, "Base Health", "Vanilla is 160");
			base.Init();
		}

		public override void Hooks()
		{
			Changes();
		}

		private void Changes()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			CharacterBody component = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Croco/CrocoBody.prefab").WaitForCompletion().GetComponent<CharacterBody>();
			component.baseDamage = baseDamage;
			component.levelDamage = baseDamage * 0.2f;
			component.baseMaxHealth = baseHealth;
			component.levelMaxHealth = baseHealth * 0.3f;
		}
	}
	internal class HurtBox : MiscBase
	{
		public static float sizeMultiplier;

		public override string Name => "Misc ::: Hurt Box";

		public override bool DoesNotKillTheMod => true;

		public override void Init()
		{
			sizeMultiplier = ConfigOption(0.75f, "Size Multiplier", "Vanilla is 1");
			base.Init();
		}

		public override void Hooks()
		{
			Changes();
		}

		private void Changes()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Croco/CrocoBody.prefab").WaitForCompletion();
			SphereCollider component = ((Component)val.transform.GetChild(0).GetChild(2).Find("TempHurtbox")).GetComponent<SphereCollider>();
			((Component)component).transform.localPosition = new Vector3(0f, 7f, 2f);
			component.radius = 5.26f * sizeMultiplier;
		}
	}
	internal class Passives : MiscBase
	{
		public static float regenHeal;

		public static float regenDur;

		public static float frenSpeed;

		public static float frenDur;

		public static SkillDef regenerativeSD;

		public static SkillDef frenziedSD;

		public static BuffDef regenerative;

		public static BuffDef frenzied;

		public static ModdedDamageType regen = DamageAPI.ReserveDamageType();

		public static ModdedDamageType frenzy = DamageAPI.ReserveDamageType();

		public static BodyIndex acridBodyIndex;

		public static UnlockableDef frenziedUnlock;

		public override string Name => "Misc :::: Passives";

		public override bool DoesNotKillTheMod => false;

		public override void Init()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: Unknown result type (might be due to invalid IL or missing references)
			//IL_020a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0215: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0456: Unknown result type (might be due to invalid IL or missing references)
			//IL_045b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0460: Unknown result type (might be due to invalid IL or missing references)
			//IL_046f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0474: Unknown result type (might be due to invalid IL or missing references)
			SkillFamily val = Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/Base/Croco/CrocoBodyPassiveFamily.asset").WaitForCompletion();
			regenerativeSD = ScriptableObject.CreateInstance<SkillDef>();
			((Object)regenerativeSD).name = "Regenerative Passive";
			regenerativeSD.skillName = "Regenerative";
			regenerativeSD.skillNameToken = "HAT_REGEN_NAME";
			regenerativeSD.skillDescriptionToken = "HAT_REGEN_DESCRIPTION";
			regenerativeSD.keywordTokens = new string[1] { "KEYWORD_RAPID_REGEN" };
			regenerativeSD.activationStateMachineName = "Weapon";
			regenerativeSD.activationState = new SerializableEntityStateType(typeof(Idle));
			regenerativeSD.interruptPriority = (InterruptPriority)1;
			regenerativeSD.baseRechargeInterval = 1f;
			regenerativeSD.baseMaxStock = 1;
			regenerativeSD.rechargeStock = 1;
			regenerativeSD.requiredStock = 1;
			regenerativeSD.stockToConsume = 1;
			regenerativeSD.resetCooldownTimerOnUse = false;
			regenerativeSD.fullRestockOnAssign = true;
			regenerativeSD.dontAllowPastMaxStocks = false;
			regenerativeSD.beginSkillCooldownOnSkillEnd = false;
			regenerativeSD.cancelSprintingOnActivation = true;
			regenerativeSD.forceSprintDuringState = false;
			regenerativeSD.canceledFromSprinting = false;
			regenerativeSD.isCombatSkill = true;
			regenerativeSD.mustKeyPress = false;
			regenerativeSD.icon = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Croco/CrocoPassivePoison.asset").WaitForCompletion().icon;
			ContentAddition.AddSkillDef(regenerativeSD);
			Sprite icon = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Croco/CrocoPassiveBlight.asset").WaitForCompletion().icon;
			frenziedSD = ScriptableObject.CreateInstance<SkillDef>();
			((Object)frenziedSD).name = "Frenzied Passive";
			frenziedSD.skillName = "Frenzied";
			frenziedSD.skillNameToken = "HAT_FRENZY_NAME";
			frenziedSD.skillDescriptionToken = "HAT_FRENZY_DESCRIPTION";
			frenziedSD.keywordTokens = new string[1] { "KEYWORD_RAPID_SPEED" };
			frenziedSD.activationStateMachineName = "Weapon";
			frenziedSD.activationState = new SerializableEntityStateType(typeof(Idle));
			frenziedSD.interruptPriority = (InterruptPriority)1;
			frenziedSD.baseRechargeInterval = 1f;
			frenziedSD.baseMaxStock = 1;
			frenziedSD.rechargeStock = 1;
			frenziedSD.requiredStock = 1;
			frenziedSD.stockToConsume = 1;
			frenziedSD.resetCooldownTimerOnUse = false;
			frenziedSD.fullRestockOnAssign = true;
			frenziedSD.dontAllowPastMaxStocks = false;
			frenziedSD.beginSkillCooldownOnSkillEnd = false;
			frenziedSD.cancelSprintingOnActivation = true;
			frenziedSD.forceSprintDuringState = false;
			frenziedSD.canceledFromSprinting = false;
			frenziedSD.isCombatSkill = true;
			frenziedSD.mustKeyPress = false;
			frenziedSD.icon = icon;
			ContentAddition.AddSkillDef(frenziedSD);
			frenziedUnlock = ScriptableObject.CreateInstance<UnlockableDef>();
			frenziedUnlock.nameToken = "ACHIEVEMENT_ACRIDFRENZIED_NAME";
			frenziedUnlock.cachedName = "Acrid.Skills_Frenzied";
			frenziedUnlock.achievementIcon = Main.iHateThis.LoadAsset<Sprite>("Assets/HIFUAcridTweaks/bloighjt.png");
			LanguageAPI.Add("ACHIEVEMENT_ACRIDFRENZIED_NAME", "Acrid: Frenzy");
			LanguageAPI.Add("ACHIEVEMENT_ACRIDFRENZIED_DESCRIPTION", "As Acrid, use 10 skills in under 3 seconds.");
			ContentAddition.AddUnlockableDef(frenziedUnlock);
			val.variants[0].skillDef = regenerativeSD;
			val.variants[1].skillDef = frenziedSD;
			val.variants[1].unlockableDef = frenziedUnlock;
			regenerative = ScriptableObject.CreateInstance<BuffDef>();
			regenerative.isDebuff = false;
			regenerative.isCooldown = false;
			regenerative.canStack = true;
			regenerative.isHidden = false;
			regenerative.buffColor = Color32.op_Implicit(new Color32((byte)201, (byte)242, (byte)77, byte.MaxValue));
			regenerative.iconSprite = Addressables.LoadAssetAsync<BuffDef>((object)"RoR2/Base/Croco/bdCrocoRegen.asset").WaitForCompletion().iconSprite;
			((Object)regenerative).name = "Regenerative";
			frenzied = ScriptableObject.CreateInstance<BuffDef>();
			frenzied.isDebuff = false;
			frenzied.isCooldown = false;
			frenzied.canStack = true;
			frenzied.isHidden = false;
			frenzied.buffColor = Color32.op_Implicit(new Color32((byte)201, (byte)242, (byte)77, byte.MaxValue));
			frenzied.iconSprite = Addressables.LoadAssetAsync<BuffDef>((object)"RoR2/DLC1/MoveSpeedOnKill/bdKillMoveSpeed.asset").WaitForCompletion().iconSprite;
			((Object)frenzied).name = "Frenzied";
			ContentAddition.AddBuffDef(regenerative);
			ContentAddition.AddBuffDef(frenzied);
			regenHeal = ConfigOption(0.05f, "Regenerative Heal Percent", "Decimal. Vanilla is 0.05");
			regenDur = ConfigOption(1f, "Regenerative Buff Duration", "Vanilla is 0.5");
			frenSpeed = ConfigOption(0.15f, "Frenzied Movement Speed", "Decimal.");
			frenDur = ConfigOption(4f, "Frenzied Buff Duration", "");
			base.Init();
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Expected O, but got Unknown
			BodyCatalog.Init += new hook_Init(BodyCatalog_Init);
			CharacterBody.onBodyStartGlobal += CharacterBody_onBodyStartGlobal;
			Slash.OnMeleeHitAuthority += new hook_OnMeleeHitAuthority(Slash_OnMeleeHitAuthority1);
			Bite.OnMeleeHitAuthority += new hook_OnMeleeHitAuthority(Bite_OnMeleeHitAuthority1);
			CharacterBody.RecalculateStats += new Manipulator(CharacterBody_RecalculateStats);
			RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients);
			GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
			HealthComponent.ServerFixedUpdate += new hook_ServerFixedUpdate(HealthComponent_ServerFixedUpdate);
			Changes();
		}

		private void Bite_OnMeleeHitAuthority1(orig_OnMeleeHitAuthority orig, Bite self)
		{
			self.hasGrantedBuff = true;
			orig.Invoke(self);
		}

		private void Slash_OnMeleeHitAuthority1(orig_OnMeleeHitAuthority orig, Slash self)
		{
			self.hasGrantedBuff = true;
			orig.Invoke(self);
		}

		private void BodyCatalog_Init(orig_Init orig)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke();
			acridBodyIndex = BodyCatalog.FindBodyIndex("CrocoBody");
		}

		private void CharacterBody_onBodyStartGlobal(CharacterBody body)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			if (body.bodyIndex == acridBodyIndex && (Object)(object)((Component)body).GetComponent<PassiveController>() == (Object)null)
			{
				((Component)body).gameObject.AddComponent<PassiveController>();
			}
		}

		private void HealthComponent_ServerFixedUpdate(orig_ServerFixedUpdate orig, HealthComponent self)
		{
			if (self.alive && Object.op_Implicit((Object)(object)self.body))
			{
				self.regenAccumulator += self.fullCombinedHealth * regenHeal / (regenDur / Time.fixedDeltaTime) * (float)self.body.GetBuffCount(regenerative);
			}
			orig.Invoke(self);
		}

		private void GlobalEventManager_onServerDamageDealt(DamageReport report)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			CharacterBody attackerBody = report.attackerBody;
			if (Object.op_Implicit((Object)(object)attackerBody))
			{
				if (DamageAPI.HasModdedDamageType(report.damageInfo, regen))
				{
					attackerBody.AddTimedBuffAuthority(regenerative.buffIndex, regenDur);
				}
				if (DamageAPI.HasModdedDamageType(report.damageInfo, frenzy))
				{
					attackerBody.AddTimedBuffAuthority(frenzied.buffIndex, frenDur);
				}
			}
		}

		private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
		{
			if (Object.op_Implicit((Object)(object)sender))
			{
				args.moveSpeedMultAdd += frenSpeed * (float)sender.GetBuffCount(frenzied);
			}
		}

		private void CharacterBody_RecalculateStats(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((MoveType)0, new Func<Instruction, bool>[7]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, "RoR2.RoR2Content/Buffs", "CrocoRegen"),
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<CharacterBody>(x, "GetBuffCount"),
				(Instruction x) => ILPatternMatchingExt.MatchConvR4(x),
				(Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 0),
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<CharacterBody>(x, "get_maxHealth"),
				(Instruction x) => ILPatternMatchingExt.MatchMul(x),
				(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 0.1f)
			}))
			{
				val.Index += 6;
				val.Next.Operand = 0f;
			}
			else
			{
				Main.HACTLogger.LogError((object)"Failed to apply Regenerative Healing hook");
			}
		}

		private void Changes()
		{
			LanguageAPI.Add("HAT_REGEN_NAME", "Regenerative");
			LanguageAPI.Add("HAT_REGEN_DESCRIPTION", "<style=cIsHealing>Regenerative</style> attacks heal over a short duration.");
			LanguageAPI.Add("HAT_FRENZY_NAME", "Frenzied");
			LanguageAPI.Add("HAT_FRENZY_DESCRIPTION", "Attacks that apply <style=cIsHealing>Regenerative</style> apply <style=cIsDamage>Frenzied</style> instead, which increases movement speed for a short duration.");
			LanguageAPI.Add("KEYWORD_RAPID_REGEN", "<style=cKeywordName>Regenerative</style><style=cSub>Heal for <style=cIsHealing>" + Math.Round(regenHeal * 100f, 2) + "%</style> of your maximum health over " + Math.Round(regenDur, 2) + "s. <i>Can stack.</i></style>");
			LanguageAPI.Add("KEYWORD_RAPID_SPEED", "<style=cKeywordName>Frenzied</style><style=cSub>Gain <style=cIsUtility>" + Math.Round(frenSpeed * 100f, 2) + "%</style> movement speed for " + Math.Round(frenDur, 2) + "s. <i>Can stack.</i></style>");
		}
	}
	[RegisterAchievement("AcridFrenzied", "Acrid.Skills_Frenzied", "BeatArena", null)]
	public class FrenziedAchievement : BaseAchievement
	{
		private static readonly int requiredSkillCount = 10;

		private CharacterBody _trackedBody;

		private DoXInYSecondsTracker tracker;

		private static readonly float windowSeconds = 3f;

		private CharacterBody trackedBody
		{
			get
			{
				return _trackedBody;
			}
			set
			{
				if (!((Object)(object)_trackedBody == (Object)(object)value))
				{
					if ((Object)(object)_trackedBody != (Object)null)
					{
						_trackedBody.onSkillActivatedAuthority -= OnSkillActivated;
					}
					_trackedBody = value;
					if ((Object)(object)_trackedBody != (Object)null)
					{
						_trackedBody.onSkillActivatedAuthority += OnSkillActivated;
					}
				}
			}
		}

		[SystemInitializer(new Type[] { typeof(OptInAttribute) })]
		public override BodyIndex LookUpRequiredBodyIndex()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			return BodyCatalog.FindBodyIndex("CrocoBody");
		}

		[SystemInitializer(new Type[] { typeof(OptInAttribute) })]
		public override void OnInstall()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			((BaseAchievement)this).OnInstall();
			tracker = new DoXInYSecondsTracker(requiredSkillCount, windowSeconds);
		}

		[SystemInitializer(new Type[] { typeof(OptInAttribute) })]
		public override void OnUninstall()
		{
			tracker = null;
			((BaseAchievement)this).OnUninstall();
		}

		[SystemInitializer(new Type[] { typeof(OptInAttribute) })]
		public override void OnBodyRequirementMet()
		{
			((BaseAchievement)this).OnBodyRequirementMet();
			trackedBody = ((BaseAchievement)this).localUser.cachedBody;
			((BaseAchievement)this).localUser.onBodyChanged += OnBodyChanged;
			tracker.Clear();
		}

		[SystemInitializer(new Type[] { typeof(OptInAttribute) })]
		public override void OnBodyRequirementBroken()
		{
			if (((BaseAchievement)this).localUser != null)
			{
				((BaseAchievement)this).localUser.onBodyChanged -= OnBodyChanged;
			}
			trackedBody = null;
			((BaseAchievement)this).OnBodyRequirementBroken();
			if (tracker != null)
			{
				tracker.Clear();
			}
		}

		[SystemInitializer(new Type[] { typeof(OptInAttribute) })]
		private void OnBodyChanged()
		{
			trackedBody = ((BaseAchievement)this).localUser.cachedBody;
			tracker.Clear();
		}

		[SystemInitializer(new Type[] { typeof(OptInAttribute) })]
		private void OnSkillActivated(GenericSkill skill)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			if (tracker.Push(FixedTimeStamp.now.t))
			{
				((BaseAchievement)this).Grant();
			}
		}
	}
	internal class Spawn : MiscBase
	{
		public override string Name => "Misc : Spawn Animation";

		public override bool DoesNotKillTheMod => true;

		public override void Init()
		{
			base.Init();
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			Spawn.OnEnter += new hook_OnEnter(Spawn_OnEnter);
			WakeUp.OnEnter += new hook_OnEnter(WakeUp_OnEnter);
		}

		private void WakeUp_OnEnter(orig_OnEnter orig, WakeUp self)
		{
			WakeUp.duration = 1.2f;
			orig.Invoke(self);
		}

		private void Spawn_OnEnter(orig_OnEnter orig, Spawn self)
		{
			Spawn.minimumSleepDuration = 0.7f;
			orig.Invoke(self);
		}
	}
}
namespace HIFUAcridTweaks.Keywords
{
	public static class Keywords
	{
		public static void Init()
		{
			LanguageAPI.Add("HAT_POISON", "<style=cKeywordName>Poisonous</style><style=cSub>Deal damage equal to <style=cIsDamage>" + Poison.percentDamagePerSecond * 100f * Poison.duration + "%</style> of the enemy's maximum health over " + Poison.duration + "s. <i>Cannot stack.</i></style>");
			LanguageAPI.Add("HAT_BLIGHT", "<style=cKeywordName>Blighted</style><style=cSub>Deal <style=cIsDamage>" + Blight.damagePerSecond * 100f * Blight.duration + "%</style> base damage over " + Blight.duration + "s. <i>Can stack.</i></style>");
		}
	}
}