Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of HIFUArtificerTweaks v1.1.9
HIFUArtificerTweaks.dll
Decompiled a year agousing 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.1", FrameworkDisplayName = ".NET Standard 2.1")] [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.9")] 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.9"; 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.9", "DO NOT CHANGE THIS"); if (enableAutoConfig.Value && (_preVersioning || latestVersion.Value != "1.1.9")) { latestVersion.Value = "1.1.9"; ConfigManager.VersionChanged = true; HATLogger.LogInfo((object)"Config Autosync Enabled."); } flamewallDamage = ((BaseUnityPlugin)this).Config.Bind<float>(": Utility :: Flamewall", "Damage", 0.55f, "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, 0f); Util.PlaySound("Play_item_use_fireballDash_start", ((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; } Util.PlaySound("Play_item_use_fireballDash_explode", ((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_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009b: 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(0.1f); ((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_018b: 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_01d6: 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_022e: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Unknown result type (might be due to invalid IL or missing references) //IL_023c: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Expected O, but got Unknown //IL_029d: Unknown result type (might be due to invalid IL or missing references) //IL_02a2: Unknown result type (might be due to invalid IL or missing references) //IL_02ab: Unknown result type (might be due to invalid IL or missing references) //IL_02b6: Unknown result type (might be due to invalid IL or missing references) //IL_02bd: Expected O, but got Unknown //IL_02c7: Unknown result type (might be due to invalid IL or missing references) //IL_02d1: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Unknown result type (might be due to invalid IL or missing references) //IL_02dd: Unknown result type (might be due to invalid IL or missing references) //IL_02e7: Unknown result type (might be due to invalid IL or missing references) //IL_02ec: 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) //IL_0308: Unknown result type (might be due to invalid IL or missing references) //IL_0319: Unknown result type (might be due to invalid IL or missing references) //IL_031e: Unknown result type (might be due to invalid IL or missing references) //IL_032f: Unknown result type (might be due to invalid IL or missing references) //IL_0334: Unknown result type (might be due to invalid IL or missing references) //IL_0345: Unknown result type (might be due to invalid IL or missing references) //IL_034a: Unknown result type (might be due to invalid IL or missing references) //IL_0357: Unknown result type (might be due to invalid IL or missing references) //IL_035c: Unknown result type (might be due to invalid IL or missing references) //IL_0362: Unknown result type (might be due to invalid IL or missing references) //IL_0383: 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 = DamageTypeCombo.op_Implicit((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>(); ParticleSystemRenderer component7 = ((Component)child2).GetComponent<ParticleSystemRenderer>(); Material val5 = new Material(Addressables.LoadAssetAsync<Material>((object)"RoR2/Base/Common/VFX/matFirePillarParticle.mat").WaitForCompletion()); val5.SetInt("_FadeCloseOn", 1); val5.SetFloat("_FadeCloseDistance", 0.09f); val5.shaderKeywords = new string[4] { "CLOUDOFFSET", "FADECLOSE", "USE_CLOUDS", "_EMISSION" }; ((Renderer)component7).material = val5; VelocityOverLifetimeModule velocityOverLifetime = component6.velocityOverLifetime; ((VelocityOverLifetimeModule)(ref velocityOverLifetime)).speedModifier = MinMaxCurve.op_Implicit(0.5f); Gradient val6 = new Gradient(); val6.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(val6); val4.transform.eulerAngles = new Vector3(0f, 0f, 90f); DestroyOnTimer val7 = val4.AddComponent<DestroyOnTimer>(); val7.duration = 7f; component5.ghostPrefab = val4; ContentAddition.AddProjectile(prefab); } } }