Decompiled source of HIFUArtificerTweaks v1.1.7

HIFUArtificerTweaks.dll

Decompiled 3 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 ArtificerExtended.Passive;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using EntityStates.Mage;
using EntityStates.Mage.Weapon;
using HIFUArtificerTweaks.Projectiles;
using HIFUArtificerTweaks.Skilldefs;
using HIFUArtificerTweaks.Skills;
using HarmonyLib;
using IL.EntityStates.Mage;
using KinematicCharacterController;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.EntityStates.Mage;
using On.EntityStates.Mage.Weapon;
using R2API;
using RoR2;
using RoR2.Projectile;
using RoR2.Skills;
using UnityEngine;
using UnityEngine.AddressableAssets;

[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("HIFUArtificerTweaks")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("HIFUArtificerTweaks")]
[assembly: AssemblyTitle("HIFUArtificerTweaks")]
[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 HIFUArtificerTweaks
{
	public static class AddUtility
	{
		public static void Create()
		{
			//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_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Expected O, but got Unknown
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mage/MageBody.prefab").WaitForCompletion();
			SkillLocator component = val.GetComponent<SkillLocator>();
			SkillFamily skillFamily = component.utility.skillFamily;
			Array.Resize(ref skillFamily.variants, skillFamily.variants.Length + 1);
			Variant[] variants = skillFamily.variants;
			int num = skillFamily.variants.Length - 1;
			Variant val2 = new Variant
			{
				skillDef = FlamewallSD.sd,
				unlockableName = ""
			};
			((Variant)(ref val2)).viewableNode = new Node(FlamewallSD.nameToken, false, (Node)null);
			variants[num] = val2;
		}
	}
	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.*/)]
	[BepInPlugin("HIFU.HIFUArtificerTweaks", "HIFUArtificerTweaks", "1.1.6")]
	public class Main : BaseUnityPlugin
	{
		public const string PluginGUID = "HIFU.HIFUArtificerTweaks";

		public const string PluginAuthor = "HIFU";

		public const string PluginName = "HIFUArtificerTweaks";

		public const string PluginVersion = "1.1.6";

		public static ConfigFile HATConfig;

		public static ConfigFile HATBackupConfig;

		public static bool aeLoaded;

		public static ManualLogSource HATLogger;

		public static ConfigEntry<float> flamewallDamage;

		public static ConfigEntry<float> flamewallSpeed;

		public static ConfigEntry<float> flamewallProcCoeff;

		public static AssetBundle hifuartificertweaks;

		public static bool _preVersioning;

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

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

		public void Awake()
		{
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Expected O, but got Unknown
			HATLogger = ((BaseUnityPlugin)this).Logger;
			HATConfig = ((BaseUnityPlugin)this).Config;
			aeLoaded = Chainloader.PluginInfos.ContainsKey("com.Borbo.ArtificerExtended");
			hifuartificertweaks = AssetBundle.LoadFromFile(Assembly.GetExecutingAssembly().Location.Replace("HIFUArtificerTweaks.dll", "hifuartificertweaks"));
			HATBackupConfig = new ConfigFile(Paths.ConfigPath + "\\HIFU.HIFUArtificerTweaks.Backup.cfg", true);
			HATBackupConfig.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 = HATConfig.Bind<bool>("Config", "Enable Auto Config Sync", true, "Disabling this would stop HIFUArtificerTweaks from syncing config whenever a new version is found.");
			_preVersioning = !((Dictionary<ConfigDefinition, string>)AccessTools.DeclaredPropertyGetter(typeof(ConfigFile), "OrphanedEntries").Invoke(HATConfig, null)).Keys.Any((ConfigDefinition x) => x.Key == "Latest Version");
			latestVersion = HATConfig.Bind<string>("Config", "Latest Version", "1.1.6", "DO NOT CHANGE THIS");
			if (enableAutoConfig.Value && (_preVersioning || latestVersion.Value != "1.1.6"))
			{
				latestVersion.Value = "1.1.6";
				ConfigManager.VersionChanged = true;
				HATLogger.LogInfo((object)"Config Autosync Enabled.");
			}
			flamewallDamage = ((BaseUnityPlugin)this).Config.Bind<float>(": Utility :: Flamewall", "Damage", 0.65f, "Decimal. Default is 0.65");
			flamewallSpeed = ((BaseUnityPlugin)this).Config.Bind<float>(": Utility :: Flamewall", "Speed Multiplier", 1.3f, "Default is 1.3");
			flamewallProcCoeff = ((BaseUnityPlugin)this).Config.Bind<float>(": Utility :: Flamewall", "Proc Coefficient", 0.15f, "Default is 0.15");
			WallOfInfernoProjectile.Create();
			FlamewallSD.Create();
			AddUtility.Create();
			IEnumerable<Type> enumerable = from type in Assembly.GetExecutingAssembly().GetTypes()
				where !type.IsAbstract && type.IsSubclassOf(typeof(TweakBase))
				select type;
			HATLogger.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;
			HATLogger.LogInfo((object)"==+----------------==MISC==----------------+==");
			foreach (Type item2 in enumerable2)
			{
				MiscBase miscBase = (MiscBase)Activator.CreateInstance(item2);
				if (ValidateMisc(miscBase))
				{
					miscBase.Init();
				}
			}
		}

		public bool ValidateTweak(TweakBase tb)
		{
			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.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 T ConfigOption<T>(T value, string name, string description)
		{
			ConfigEntry<T> val = Main.HATConfig.Bind<T>(Name, name, value, description);
			ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HATBackupConfig, name);
			return val.Value;
		}

		public abstract void Hooks();

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

		public virtual void Init()
		{
			Hooks();
			Main.HATLogger.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 bool done = false;

		public abstract string Name { get; }

		public abstract string SkillToken { get; }

		public abstract string DescText { get; }

		public virtual bool isEnabled { get; } = true;


		public T ConfigOption<T>(T value, string name, string description)
		{
			ConfigEntry<T> val = Main.HATConfig.Bind<T>(Name, name, value, description);
			ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HATBackupConfig, name);
			if (!done)
			{
				ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)Main.flamewallDamage, Main.HATBackupConfig, ((ConfigEntryBase)Main.flamewallDamage).Definition.Key);
				ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)Main.flamewallSpeed, Main.HATBackupConfig, ((ConfigEntryBase)Main.flamewallSpeed).Definition.Key);
				ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)Main.flamewallProcCoeff, Main.HATBackupConfig, ((ConfigEntryBase)Main.flamewallProcCoeff).Definition.Key);
				done = true;
			}
			return val.Value;
		}

		public abstract void Hooks();

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

		public virtual void Init()
		{
			Hooks();
			string text = "MAGE_" + SkillToken.ToUpper() + "_DESCRIPTION";
			LanguageAPI.Add(text, DescText);
			Main.HATLogger.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 HIFUArtificerTweaks.Skills
{
	public class CastNanoSpear : TweakBase
	{
		public static float minDamage;

		public static float maxDamage;

		public static float castTime;

		public override string Name => ": Secondary :: Cast Nano-Spear";

		public override string SkillToken => "secondary_ice";

		public override string DescText => "<style=cIsUtility>Freezing</style>. Charge up a <style=cIsDamage>piercing</style> nano-spear that deals <style=cIsDamage>" + d(minDamage) + "-" + d(maxDamage) + "</style> damage.";

		public override void Init()
		{
			minDamage = ConfigOption(4f, "Minimum Damage", "Decimal. Vanilla is 4");
			maxDamage = ConfigOption(16f, "Maximum Damage", "Decimal. Vanilla is 12");
			castTime = ConfigOption(1.3f, "Max Charge Time", "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
			BaseChargeBombState.OnEnter += new hook_OnEnter(BaseChargeBombState_OnEnter);
			BaseThrowBombState.OnEnter += new hook_OnEnter(BaseThrowBombState_OnEnter);
		}

		private void BaseChargeBombState_OnEnter(orig_OnEnter orig, BaseChargeBombState self)
		{
			if (self is ChargeIcebomb)
			{
				self.baseDuration = castTime;
			}
			orig.Invoke(self);
		}

		private void BaseThrowBombState_OnEnter(orig_OnEnter orig, BaseThrowBombState self)
		{
			if (self is ThrowIcebomb)
			{
				self.minDamageCoefficient = minDamage;
				self.maxDamageCoefficient = maxDamage;
			}
			orig.Invoke(self);
		}
	}
	public class ChargedNanoBomb : TweakBase
	{
		public static float minDamage;

		public static float maxDamage;

		public static float castTime;

		public override string Name => ": Secondary :: Charged Nano-Bomb";

		public override string SkillToken => "secondary_lightning";

		public override string DescText => "<style=cIsDamage>Stunning</style>. Charge up a <style=cIsDamage>exploding</style> nano-bomb that deals <style=cIsDamage>" + d(minDamage) + "-" + d(maxDamage) + "</style> damage.";

		public override void Init()
		{
			minDamage = ConfigOption(4f, "Minimum Damage", "Decimal. Vanilla is 4");
			maxDamage = ConfigOption(20f, "Maximum Damage", "Decimal. Vanilla is 20");
			castTime = ConfigOption(2f, "Max Charge Time", "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
			BaseChargeBombState.OnEnter += new hook_OnEnter(BaseChargeBombState_OnEnter);
			BaseThrowBombState.OnEnter += new hook_OnEnter(BaseThrowBombState_OnEnter);
		}

		private void BaseChargeBombState_OnEnter(orig_OnEnter orig, BaseChargeBombState self)
		{
			if (self is ChargeNovabomb)
			{
				self.baseDuration = castTime;
			}
			orig.Invoke(self);
		}

		private void BaseThrowBombState_OnEnter(orig_OnEnter orig, BaseThrowBombState self)
		{
			if (self is ThrowNovabomb)
			{
				self.minDamageCoefficient = minDamage;
				self.maxDamageCoefficient = maxDamage;
			}
			orig.Invoke(self);
		}
	}
	public class Flamethrower : TweakBase
	{
		public static float Damage;

		public static float BurnChance;

		public static float Range;

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

		public override string SkillToken => "special_fire";

		public override string DescText => "<style=cIsDamage>Ignite</style>. Burn all enemies in front of you for <style=cIsDamage>" + d(Damage + Damage / (1f / (BurnChance / 100f))) + " damage</style>.";

		public override void Init()
		{
			Damage = ConfigOption(20f, "Damage", "Decimal. Vanilla is 20");
			BurnChance = ConfigOption(100f, "Ignite Chance", "Decimal. Vanilla is 50");
			Range = ConfigOption(20f, "Range", "Vanilla is 20");
			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
			Flamethrower.OnEnter += new hook_OnEnter(Flamethrower_OnEnter);
		}

		private void Flamethrower_OnEnter(orig_OnEnter orig, Flamethrower self)
		{
			Flamethrower.ignitePercentChance = BurnChance;
			Flamethrower.totalDamageCoefficient = Damage;
			self.maxDistance = Range;
			orig.Invoke(self);
		}
	}
	public class FlamewallState : BaseSkillState
	{
		public float duration = 2f;

		public float timer;

		public float interval = 0.25f;

		public float speedMultiplier = Main.flamewallSpeed.Value;

		private Vector3 idealDirection;

		public GameObject wallPrefab = WallOfInfernoProjectile.prefab;

		public SkillLocator sl;

		public override void OnEnter()
		{
			//IL_003e: 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_00f3: Unknown result type (might be due to invalid IL or missing references)
			((BaseState)this).OnEnter();
			sl = ((Component)((EntityState)this).characterBody).GetComponent<SkillLocator>();
			if (((EntityState)this).isAuthority)
			{
				if (Object.op_Implicit((Object)(object)((EntityState)this).inputBank))
				{
					idealDirection = ((EntityState)this).inputBank.aimDirection;
					idealDirection.y = 0f;
				}
				if (Object.op_Implicit((Object)(object)sl) && sl.special.skillNameToken == "MAGE_SPECIAL_FIRE_NAME")
				{
					sl.special.skillDef.canceledFromSprinting = false;
					sl.special.skillDef.cancelSprintingOnActivation = false;
				}
				UpdateDirection();
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).modelLocator))
			{
				((EntityState)this).modelLocator.normalizeToFloor = true;
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
			{
				((EntityState)this).characterDirection.forward = idealDirection;
			}
			if (Main.aeLoaded)
			{
				SkillCast();
			}
			((EntityState)this).characterBody.SetAimTimer(duration + 1f);
			((EntityState)this).PlayAnimation("Gesture, Additive", "PrepWall", "PrepWall.playbackRate", duration);
			AkSoundEngine.PostEvent(2855368448u, ((EntityState)this).gameObject);
		}

		[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
		public void SkillCast()
		{
			GameObject gameObject = ((Component)((EntityState)this).outer).gameObject;
			if (AltArtiPassive.instanceLookup.TryGetValue(gameObject, out var value))
			{
				value.SkillCast((BatchHandle)null);
			}
		}

		private void UpdateDirection()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: 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_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)((EntityState)this).inputBank))
			{
				Vector2 val = Util.Vector3XZToVector2XY(((EntityState)this).inputBank.moveVector);
				if (val != Vector2.zero)
				{
					((Vector2)(ref val)).Normalize();
					Vector3 val2 = new Vector3(val.x, 0f, val.y);
					idealDirection = ((Vector3)(ref val2)).normalized;
				}
			}
		}

		private Vector3 GetIdealVelocity()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			return ((EntityState)this).characterDirection.forward * ((EntityState)this).characterBody.moveSpeed * speedMultiplier;
		}

		public override void FixedUpdate()
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: 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_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: 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_0097: 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_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)
			((EntityState)this).FixedUpdate();
			timer += Time.fixedDeltaTime;
			if (!((EntityState)this).isAuthority)
			{
				return;
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
			{
				((EntityState)this).characterBody.isSprinting = true;
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterDirection))
			{
				((EntityState)this).characterDirection.moveVector = idealDirection;
				if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && !((EntityState)this).characterMotor.disableAirControlUntilCollision)
				{
					CharacterMotor characterMotor = ((EntityState)this).characterMotor;
					characterMotor.rootMotion += GetIdealVelocity() * Time.fixedDeltaTime;
				}
			}
			UpdateDirection();
			if (((EntityState)this).fixedAge >= duration)
			{
				((EntityState)this).outer.SetNextStateToMain();
			}
			else if (timer >= interval)
			{
				Vector3 up = Vector3.up;
				FireProjectileInfo val = default(FireProjectileInfo);
				val.projectilePrefab = wallPrefab;
				val.position = ((EntityState)this).characterBody.corePosition;
				val.rotation = Util.QuaternionSafeLookRotation(up);
				val.owner = ((EntityState)this).gameObject;
				val.damage = ((BaseState)this).damageStat;
				val.force = 0f;
				val.damageColorIndex = (DamageColorIndex)0;
				val.crit = Util.CheckRoll(((BaseState)this).critStat, ((EntityState)this).characterBody.master);
				FireProjectileInfo val2 = val;
				ProjectileManager.instance.FireProjectile(val2);
				Util.PlaySound(Flamethrower.endAttackSoundString, ((EntityState)this).gameObject);
				timer = 0f;
			}
		}

		public override void OnExit()
		{
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			((EntityState)this).OnExit();
			if (!((EntityState)this).outer.destroying && Object.op_Implicit((Object)(object)((EntityState)this).characterBody))
			{
				((EntityState)this).PlayAnimation("Gesture, Additive", "FireWall");
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).characterMotor) && !((EntityState)this).characterMotor.disableAirControlUntilCollision)
			{
				CharacterMotor characterMotor = ((EntityState)this).characterMotor;
				characterMotor.velocity += GetIdealVelocity();
			}
			if (Object.op_Implicit((Object)(object)((EntityState)this).modelLocator))
			{
				((EntityState)this).modelLocator.normalizeToFloor = false;
			}
			if (((EntityState)this).isAuthority && Object.op_Implicit((Object)(object)sl) && sl.special.skillNameToken == "MAGE_SPECIAL_FIRE_NAME")
			{
				sl.special.skillDef.canceledFromSprinting = true;
				sl.special.skillDef.cancelSprintingOnActivation = true;
			}
			AkSoundEngine.PostEvent(561188827u, ((EntityState)this).gameObject);
		}

		public override InterruptPriority GetMinimumInterruptPriority()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return (InterruptPriority)2;
		}
	}
	public class IonSurge : TweakBase
	{
		public static float AoE;

		public static float Cooldown;

		public static float Damage;

		public static float dashSpeed;

		public static float Duration;

		public static bool ScaleWithSpeed;

		public override string Name => ": Special :: Ion Surge";

		public override string SkillToken => "special_lightning";

		public override string DescText => "<style=cIsDamage>Stunning</style>. Soar and dash, dealing <style=cIsDamage>" + d(Damage) + " damage</style> in a large area.";

		public override void Init()
		{
			AoE = ConfigOption(14f, "Area of Effect", "Vanilla is 14");
			Cooldown = ConfigOption(5f, "Cooldown", "Vanilla is 8");
			Damage = ConfigOption(8f, "Damage", "Decimal. Vanilla is 8");
			dashSpeed = ConfigOption(3.5f, "Dash Speed Multiplier", "Default is 3.5");
			Duration = ConfigOption(0.3f, "Duration", "This affects height. Vanilla is 1.66");
			ScaleWithSpeed = ConfigOption(value: false, "Make Height scale with Movement Speed?", "Vanilla is true");
			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_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Expected O, but got Unknown
			FlyUpState.OnEnter += new hook_OnEnter(FlyUpState_OnEnter);
			if (!ScaleWithSpeed)
			{
				FlyUpState.HandleMovements += new Manipulator(FlyUpState_HandleMovements);
			}
			Changes();
		}

		private void FlyUpState_HandleMovements(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.MatchLdfld<BaseState>(x, "moveSpeedStat")
			}))
			{
				int index = val.Index;
				val.Index = index + 1;
				val.EmitDelegate<Func<float, float>>((Func<float, float>)((float orig) => 10.15f));
			}
			else
			{
				Main.HATLogger.LogError((object)"Failed to IL hook Ion Surge Handle Movements");
			}
		}

		private void FlyUpState_OnEnter(orig_OnEnter orig, FlyUpState self)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: 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)
			FlyUpState.blastAttackRadius = AoE;
			FlyUpState.blastAttackDamageCoefficient = Damage;
			FlyUpState.duration = Duration;
			orig.Invoke(self);
			if (((EntityState)self).isAuthority)
			{
				Vector3 val = ((((EntityState)self).inputBank.moveVector == Vector3.zero) ? Vector3.zero : ((Vector3)(ref ((EntityState)self).inputBank.moveVector)).normalized);
				Vector3 velocity = ((Vector3)(ref val)).normalized * dashSpeed * ((BaseState)self).moveSpeedStat;
				((BaseCharacterController)((EntityState)self).characterMotor).Motor.ForceUnground();
				((EntityState)self).characterMotor.velocity = velocity;
			}
		}

		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/Mage/MageBodyFlyUp.asset").WaitForCompletion();
			val.baseRechargeInterval = Cooldown;
		}
	}
	public class PlasmaBolt : TweakBase
	{
		public static float AoE;

		public static float Damage;

		public override string Name => ": Primary :: Plasma Bolt";

		public override string SkillToken => "primary_lightning";

		public override string DescText => "Fire a bolt for <style=cIsDamage>" + d(Damage) + " damage</style> that <style=cIsDamage>explodes</style> in a medium area. Hold up to 4.</style>";

		public override void Init()
		{
			AoE = ConfigOption(6f, "Area of Effect", "Vanilla is 6");
			Damage = ConfigOption(3f, "Damage", "Decimal. Vanilla is 2.8");
			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
			FireFireBolt.OnEnter += new hook_OnEnter(FireFireBolt_OnEnter);
			Changes();
		}

		private void FireFireBolt_OnEnter(orig_OnEnter orig, FireFireBolt self)
		{
			if (self is FireLightningBolt)
			{
				self.damageCoefficient = Damage;
			}
			orig.Invoke(self);
		}

		public static 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)
			GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mage/MageLightningboltBasic.prefab").WaitForCompletion();
			((ProjectileExplosion)val.GetComponent<ProjectileImpactExplosion>()).blastRadius = AoE;
		}
	}
	public class Snapfreeze : TweakBase
	{
		public static float damage;

		public static float lifetime;

		public override string Name => ": Utility : Snapfreeze";

		public override string SkillToken => "utility_ice";

		public override string DescText => "<style=cIsUtility>Freezing</style>. Create a barrier that hurts enemies for <style=cIsDamage>" + d(damage) + " damage</style>.";

		public override void Init()
		{
			lifetime = ConfigOption(0.35f, "Lifetime", "Vanilla is 0.3. Wall Count = 40 * lifetime");
			damage = ConfigOption(1.2f, "Damage", "Decimal. Vanilla is 1");
			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
			PrepWall.OnEnter += new hook_OnEnter(PrepWall_OnEnter);
			Changes();
		}

		private void PrepWall_OnEnter(orig_OnEnter orig, PrepWall self)
		{
			PrepWall.damageCoefficient = 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)
			GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mage/MageIcewallWalkerProjectile.prefab").WaitForCompletion();
			ProjectileCharacterController component = val.GetComponent<ProjectileCharacterController>();
			component.lifetime = lifetime;
		}
	}
}
namespace HIFUArtificerTweaks.Skilldefs
{
	public static class FlamewallSD
	{
		public static SkillDef sd;

		public static string nameToken = "HAT_UTILITY_FIRE_NAME";

		public static void Create()
		{
			//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_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: 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_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mage/MageBody.prefab").WaitForCompletion();
			EntityStateMachine val2 = val.AddComponent<EntityStateMachine>();
			val2.customName = "Wall";
			val2.initialStateType = new SerializableEntityStateType(typeof(Idle));
			val2.mainStateType = new SerializableEntityStateType(typeof(Idle));
			sd = ScriptableObject.CreateInstance<SkillDef>();
			sd.activationState = new SerializableEntityStateType(typeof(FlamewallState));
			sd.activationStateMachineName = "Wall";
			sd.interruptPriority = (InterruptPriority)1;
			sd.baseRechargeInterval = 12f;
			sd.baseMaxStock = 1;
			sd.rechargeStock = 1;
			sd.requiredStock = 1;
			sd.stockToConsume = 1;
			sd.resetCooldownTimerOnUse = false;
			sd.fullRestockOnAssign = true;
			sd.dontAllowPastMaxStocks = false;
			sd.beginSkillCooldownOnSkillEnd = true;
			sd.cancelSprintingOnActivation = false;
			sd.canceledFromSprinting = false;
			sd.isCombatSkill = true;
			sd.mustKeyPress = false;
			sd.icon = Main.hifuartificertweaks.LoadAsset<Sprite>("Assets/Flamewall.png");
			sd.skillNameToken = nameToken;
			sd.skillDescriptionToken = "HAT_UTILITY_FIRE_DESCRIPTION";
			sd.keywordTokens = new string[2] { "KEYWORD_IGNITE", "KEYWORD_AGILE" };
			LanguageAPI.Add("HAT_UTILITY_FIRE_NAME", "Flamewall");
			LanguageAPI.Add("HAT_UTILITY_FIRE_DESCRIPTION", "<style=cIsUtility>Agile</style>. <style=cIsDamage>Ignite</style>. Rush forward, summoning pillars of fire in your wake that deal <style=cIsDamage>" + Main.flamewallDamage.Value * 100f + "% damage per second</style>.");
			ContentAddition.AddSkillDef(sd);
		}
	}
}
namespace HIFUArtificerTweaks.Projectiles
{
	public static class WallOfInfernoProjectile
	{
		public static GameObject prefab;

		public static float damage = Main.flamewallDamage.Value;

		public static float procCoeff = Main.flamewallProcCoeff.Value;

		public static void Create()
		{
			//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_003c: 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_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: 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_0207: Unknown result type (might be due to invalid IL or missing references)
			//IL_021d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0222: 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_0236: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: Expected O, but got Unknown
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			//IL_0251: Unknown result type (might be due to invalid IL or missing references)
			//IL_0256: Unknown result type (might be due to invalid IL or missing references)
			//IL_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0267: Unknown result type (might be due to invalid IL or missing references)
			//IL_026c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0283: Unknown result type (might be due to invalid IL or missing references)
			//IL_0288: Unknown result type (might be due to invalid IL or missing references)
			//IL_0299: Unknown result type (might be due to invalid IL or missing references)
			//IL_029e: Unknown result type (might be due to invalid IL or missing references)
			//IL_02af: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0303: Unknown result type (might be due to invalid IL or missing references)
			prefab = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/ElementalRings/FireTornado.prefab").WaitForCompletion(), "WallOfInfernoPillar");
			prefab.transform.eulerAngles = new Vector3(0f, 0f, 90f);
			Object.Destroy((Object)(object)prefab.GetComponent<SphereCollider>());
			CapsuleCollider val = prefab.AddComponent<CapsuleCollider>();
			((Collider)val).isTrigger = false;
			val.center = new Vector3(0f, 0f, 0f);
			val.radius = 1f;
			val.height = 1f;
			Transform child = prefab.transform.GetChild(0);
			((Component)child).transform.localScale = new Vector3(8.5f, 8.5f, 20f);
			((Component)child).transform.localPosition = new Vector3(0f, 0f, 8f);
			Rigidbody component = prefab.GetComponent<Rigidbody>();
			component.collisionDetectionMode = (CollisionDetectionMode)1;
			component.useGravity = true;
			component.freezeRotation = true;
			ConstantForce val2 = prefab.AddComponent<ConstantForce>();
			val2.force = new Vector3(0f, -2500f, 0f);
			ProjectileStickOnImpact val3 = prefab.AddComponent<ProjectileStickOnImpact>();
			val3.ignoreCharacters = true;
			val3.ignoreWorld = false;
			val3.alignNormals = false;
			ProjectileSimple component2 = prefab.GetComponent<ProjectileSimple>();
			component2.lifetime = 7f;
			ProjectileDamage component3 = prefab.GetComponent<ProjectileDamage>();
			component3.damageType = (DamageType)128;
			ProjectileOverlapAttack component4 = prefab.GetComponent<ProjectileOverlapAttack>();
			component4.damageCoefficient = damage;
			component4.resetInterval = 1f;
			component4.overlapProcCoefficient = procCoeff;
			ProjectileController component5 = prefab.GetComponent<ProjectileController>();
			GameObject val4 = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Junk/Mage/MageFirePillarGhost.prefab").WaitForCompletion(), "WallOfInfernoPillarGhost", false);
			Transform child2 = val4.transform.GetChild(0);
			child2.localScale = new Vector3(2.5f, 4f, 2.5f);
			ParticleSystem component6 = ((Component)child2).GetComponent<ParticleSystem>();
			VelocityOverLifetimeModule velocityOverLifetime = component6.velocityOverLifetime;
			((VelocityOverLifetimeModule)(ref velocityOverLifetime)).speedModifier = MinMaxCurve.op_Implicit(0.5f);
			Gradient val5 = new Gradient();
			val5.SetKeys((GradientColorKey[])(object)new GradientColorKey[2]
			{
				new GradientColorKey(Color.white, 0f),
				new GradientColorKey(Color.white, 1f)
			}, (GradientAlphaKey[])(object)new GradientAlphaKey[4]
			{
				new GradientAlphaKey(0f, 0f),
				new GradientAlphaKey(1f, 0.7f),
				new GradientAlphaKey(1f, 0.9f),
				new GradientAlphaKey(0f, 1f)
			});
			ColorOverLifetimeModule colorOverLifetime = component6.colorOverLifetime;
			((ColorOverLifetimeModule)(ref colorOverLifetime)).color = MinMaxGradient.op_Implicit(val5);
			val4.transform.eulerAngles = new Vector3(0f, 0f, 90f);
			DestroyOnTimer val6 = val4.AddComponent<DestroyOnTimer>();
			val6.duration = 7f;
			component5.ghostPrefab = val4;
			ContentAddition.AddProjectile(prefab);
		}
	}
}