Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of HIFUHuntressTweaks v5.0.7
HIFUHuntressTweaks.dll
Decompiled 2 years 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 BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using EntityStates.Huntress; using EntityStates.Huntress.HuntressWeapon; using EntityStates.Huntress.Weapon; using HarmonyLib; using Microsoft.CodeAnalysis; using On.EntityStates; using On.EntityStates.Huntress; using On.EntityStates.Huntress.HuntressWeapon; 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("HIFUHuntressTweaks")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("HIFUHuntressTweaks")] [assembly: AssemblyTitle("HIFUHuntressTweaks")] [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 HIFUHuntressTweaks { 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.*/)] [BepInPlugin("HIFU.HIFUHuntressTweaks", "HIFUHuntressTweaks", "5.0.6")] public class Main : BaseUnityPlugin { public const string PluginGUID = "HIFU.HIFUHuntressTweaks"; public const string PluginAuthor = "HIFU"; public const string PluginName = "HIFUHuntressTweaks"; public const string PluginVersion = "5.0.6"; public static ConfigFile HHTConfig; public static ConfigFile HHTBackupConfig; public static ManualLogSource HHTLogger; public static bool _preVersioning; public static ConfigEntry<bool> enableAutoConfig { get; set; } public static ConfigEntry<string> latestVersion { get; set; } public void Awake() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown HHTLogger = ((BaseUnityPlugin)this).Logger; HHTConfig = ((BaseUnityPlugin)this).Config; HHTBackupConfig = new ConfigFile(Paths.ConfigPath + "\\HIFU.HIFUHuntressTweaks.Backup.cfg", true); HHTBackupConfig.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 = HHTConfig.Bind<bool>("Config", "Enable Auto Config Sync", true, "Disabling this would stop HIFUHuntressTweaks from syncing config whenever a new version is found."); _preVersioning = !((Dictionary<ConfigDefinition, string>)AccessTools.DeclaredPropertyGetter(typeof(ConfigFile), "OrphanedEntries").Invoke(HHTConfig, null)).Keys.Any((ConfigDefinition x) => x.Key == "Latest Version"); latestVersion = HHTConfig.Bind<string>("Config", "Latest Version", "5.0.6", "DO NOT CHANGE THIS"); if (enableAutoConfig.Value && (_preVersioning || latestVersion.Value != "5.0.6")) { latestVersion.Value = "5.0.6"; ConfigManager.VersionChanged = true; HHTLogger.LogInfo((object)"Config Autosync Enabled."); } IEnumerable<Type> enumerable = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(TweakBase)) select type; HHTLogger.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; HHTLogger.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?", false, "Vanilla is false").Value) { return true; } return false; } private void PeripheryMyBeloved() { } } 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.HHTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HHTBackupConfig, name); return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); Main.HHTLogger.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 T ConfigOption<T>(T value, string name, string description) { ConfigEntry<T> val = Main.HHTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HHTBackupConfig, name); return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); string text = "HUNTRESS_" + SkillToken.ToUpper() + "_DESCRIPTION"; LanguageAPI.Add(text, DescText); Main.HHTLogger.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 HIFUHuntressTweaks.Skills { public class ArrowRain : TweakBase { public static float damage; public static float procCoefficient; public static float cooldown; public static float sizeMultiplier; public static float heightMultiplier; public override string Name => ": Special : Arrow Rain"; public override string SkillToken => "special"; public override string DescText => "<style=cIsUtility>Teleport</style> into the sky. Target an area to rain arrows, <style=cIsUtility>slowing</style> all enemies and dealing <style=cIsDamage>" + damage * 300f + "% damage per second</style>."; public override void Init() { damage = ConfigOption(1.4f, "Damage", "Decimal. Vanilla is 1.1"); procCoefficient = ConfigOption(0.7f, "Proc Coefficient", "Vanilla is 0.2"); cooldown = ConfigOption(9f, "Cooldown", "Vanilla is 12"); sizeMultiplier = ConfigOption(1.3f, "Hitbox Size Multiplier", "Vanilla is 1"); heightMultiplier = ConfigOption(3f, "Hitbox Height Multiplier", "Vanilla is 1"); base.Init(); } public override void Hooks() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown Changes(); ArrowRain.OnEnter += new hook_OnEnter(ArrowRain_OnEnter); } private void ArrowRain_OnEnter(orig_OnEnter orig, ArrowRain self) { ArrowRain.damageCoefficient = damage / 0.5f; orig.Invoke(self); } public static void Changes() { //IL_0045: Unknown result type (might be due to invalid IL or missing references) GameObject val = LegacyResourcesAPI.Load<GameObject>("prefabs/projectiles/HuntressArrowRain"); ProjectileDotZone component = val.GetComponent<ProjectileDotZone>(); component.overlapProcCoefficient = procCoefficient; val.transform.localScale = new Vector3(15f * sizeMultiplier, 15f * heightMultiplier, 15f * sizeMultiplier); LegacyResourcesAPI.Load<SkillDef>("skilldefs/huntressbody/HuntressBodyArrowRain").baseRechargeInterval = cooldown; } } public class Ballista : TweakBase { public static float damage; public static float procCoefficient; public static float cooldown; public static int boltCount; public override string Name => ": Special :: Ballista"; public override string SkillToken => "special_alt1"; public override string DescText => "<style=cIsUtility>Teleport</style> backwards into the sky. Fire up to <style=cIsDamage>" + boltCount + "</style> energy bolts, dealing <style=cIsDamage>" + boltCount + "x" + d(damage) + " damage</style>."; public override void Init() { damage = ConfigOption(7.5f, "Damage", "Decimal. Vanilla is 9"); procCoefficient = ConfigOption(1f, "Proc Coefficient", "Vanilla is 1"); cooldown = ConfigOption(10f, "Cooldown", "Vanilla is 12"); boltCount = ConfigOption(4, "Bolt Count", "Vanilla is 3"); base.Init(); } public override void Hooks() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown Changes(); GenericBulletBaseState.OnEnter += new hook_OnEnter(GenericBulletBaseState_OnEnter); } private void GenericBulletBaseState_OnEnter(orig_OnEnter orig, GenericBulletBaseState self) { if (self is FireArrowSnipe) { self.damageCoefficient = damage; self.procCoefficient = procCoefficient; } 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) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Huntress/AimArrowSnipe.asset").WaitForCompletion(); SkillDef val2 = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Huntress/FireArrowSnipe.asset").WaitForCompletion(); val.baseRechargeInterval = cooldown; val2.baseMaxStock = boltCount; } } public class Blink : TweakBase { public static float cooldown; public static float speedCoefficient; public override string Name => ": Utility : Blink"; public override string SkillToken => "utility"; public override string DescText => "<style=cIsUtility>Agile</style>. <style=cIsUtility>Disappear</style> and <style=cIsUtility>teleport</style> forward."; public override void Init() { cooldown = ConfigOption(6.5f, "Cooldown", "Vanilla is 7"); speedCoefficient = ConfigOption(15f, "Speed Coefficient", "Vanilla is 14"); base.Init(); } public override void Hooks() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown Changes(); BlinkState.OnEnter += new hook_OnEnter(BlinkState_OnEnter); } private void BlinkState_OnEnter(orig_OnEnter orig, BlinkState self) { if (self != null) { self.speedCoefficient = speedCoefficient; } orig.Invoke(self); } public static void Changes() { SkillDef val = LegacyResourcesAPI.Load<SkillDef>("skilldefs/huntressbody/HuntressBodyBlink"); val.baseRechargeInterval = cooldown; val.keywordTokens = new string[1] { "KEYWORD_AGILE" }; } } public class Flurry : TweakBase { public static float damage; public static float procCoefficient; public static float fireRate; public static int minArrows; public static int maxArrows; public override string Name => ": Primary :: Flurry"; public override string SkillToken => "primary_alt"; public override string DescText => "<style=cIsUtility>Agile</style>. Draw back a volley of <style=cIsDamage>" + minArrows + "</style> seeking arrows for <style=cIsDamage>" + minArrows + "x" + d(damage) + " damage</style>. Critical Strikes fire <style=cIsDamage>" + maxArrows + "</style> arrows."; public override void Init() { damage = ConfigOption(1.1f, "Damage", "Decimal. Vanilla is 1"); procCoefficient = ConfigOption(1f, "Proc Coefficient", "Vanilla is 0.7"); fireRate = ConfigOption(1f, "Fire Rate", "Vanilla is 1.3"); minArrows = ConfigOption(3, "Minimum Arrows", "Vanilla is 3"); maxArrows = ConfigOption(6, "Maximum Arrows", "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 FireSeekingArrow.OnEnter += new hook_OnEnter(FireSeekingArrow_OnEnter); FireFlurrySeekingArrow.OnEnter += new hook_OnEnter(FireFlurrySeekingArrow_OnEnter); } private void FireFlurrySeekingArrow_OnEnter(orig_OnEnter orig, FireFlurrySeekingArrow self) { FireFlurrySeekingArrow.critMaxArrowCount = maxArrows; orig.Invoke(self); } private void FireSeekingArrow_OnEnter(orig_OnEnter orig, FireSeekingArrow self) { if (self is FireFlurrySeekingArrow) { self.orbDamageCoefficient = damage; self.orbProcCoefficient = procCoefficient; self.maxArrowCount = minArrows; self.baseDuration = fireRate; } orig.Invoke(self); } } public class LaserGlaive : TweakBase { public static float damage; public static float procCoefficient; public static float bounceDamage; public static int bounceCount; public static float cooldown; public static float antigrav; public static float duration; public static bool agile; public override string Name => ": Secondary : Laser Glaive"; public override string SkillToken => "secondary"; public override string DescText => (agile ? "<style=cIsUtility>Agile</style>. " : "") + "Throw a seeking glaive that bounces up to <style=cIsDamage>" + bounceCount + "</style> times for <style=cIsDamage>" + d(damage) + " damage</style>. Damage increases by <style=cIsDamage>" + Math.Round((bounceDamage - 1f) * 100f, 1) + "%</style> per bounce."; public override void Init() { damage = ConfigOption(3.5f, "Damage", "Decimal. Vanilla is 2.5"); procCoefficient = ConfigOption(1f, "Proc Coefficient", "Vanilla is 0.8"); bounceDamage = ConfigOption(1.025f, "Damage Multiplier Per Bounce", "Decimal. Vanilla is 1.1"); bounceCount = ConfigOption(6, "Bounces", "Vanilla is 6"); cooldown = ConfigOption(6f, "Cooldown", "Vanilla is 7"); antigrav = ConfigOption(40f, "Jump Boost", "Vanilla is 30"); duration = ConfigOption(0.8f, "Animation Speed", "Vanilla is 1.1"); agile = ConfigOption(value: true, "Enable Agile?", "Vanilla is false"); base.Init(); } public override void Hooks() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown Changes(); ThrowGlaive.OnEnter += new hook_OnEnter(ThrowGlaive_OnEnter); } private void ThrowGlaive_OnEnter(orig_OnEnter orig, ThrowGlaive self) { ThrowGlaive.damageCoefficient = damage; ThrowGlaive.damageCoefficientPerBounce = bounceDamage; ThrowGlaive.maxBounceCount = bounceCount; ThrowGlaive.glaiveProcCoefficient = procCoefficient; ThrowGlaive.antigravityStrength = antigrav / duration; ThrowGlaive.baseDuration = duration; orig.Invoke(self); } public static void Changes() { SkillDef val = LegacyResourcesAPI.Load<SkillDef>("skilldefs/huntressbody/HuntressBodyGlaive"); val.baseRechargeInterval = cooldown; if (agile) { val.cancelSprintingOnActivation = false; val.keywordTokens = new string[1] { "KEYWORD_AGILE" }; } } } public class PhaseBlink : TweakBase { public static float cooldown; public static float speedCoefficient; public static int charges; public static int chargesToRecharge; public static bool resetChargeCooldown; public override string Name => ": Utility :: Phase Blink"; public override string SkillToken => "utility_alt1"; public override string DescText => "<style=cIsUtility>Agile</style>. <style=cIsUtility>Disappear</style> and <style=cIsUtility>teleport</style> a short distance. Can store up to <style=cIsUtility>" + charges + "</style> charges."; public override void Init() { cooldown = ConfigOption(7f, "Cooldown", "Vanilla is 2"); speedCoefficient = ConfigOption(15f, "Speed Coefficient", "Vanilla is 15"); charges = ConfigOption(3, "Charge Count", "Vanilla is 3"); chargesToRecharge = ConfigOption(3, "Charges to Recharge", "Vanilla is 1"); resetChargeCooldown = ConfigOption(value: false, "Reset Charge Cooldown on use?", "Vanilla is false"); base.Init(); } public override void Hooks() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown Changes(); BlinkState.OnEnter += new hook_OnEnter(BlinkState_OnEnter); } private void BlinkState_OnEnter(orig_OnEnter orig, BlinkState self) { if (self is MiniBlinkState) { self.speedCoefficient = speedCoefficient; } orig.Invoke(self); } public static void Changes() { SkillDef val = LegacyResourcesAPI.Load<SkillDef>("skilldefs/huntressbody/HuntressBodyMiniBlink"); val.baseRechargeInterval = cooldown; val.baseMaxStock = charges; val.rechargeStock = chargesToRecharge; val.resetCooldownTimerOnUse = resetChargeCooldown; } } public class Strafe : TweakBase { public static float damage; public static float procCoefficient; public static float fireRate; public override string Name => ": Primary : Strafe"; public override string SkillToken => "primary"; public override string DescText => "<style=cIsUtility>Agile</style>. Quickly fire a seeking arrow for <style=cIsDamage>" + d(damage) + " damage</style>."; public override void Init() { damage = ConfigOption(1.8f, "Damage", "Decimal. Vanilla is 1.5"); procCoefficient = ConfigOption(1f, "Proc Coefficient", "Vanilla is 1"); fireRate = ConfigOption(1f / 3f, "Duration", "Vanilla is 0.5"); 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 FireSeekingArrow.OnEnter += new hook_OnEnter(FireSeekingArrow_OnEnter); } private void FireSeekingArrow_OnEnter(orig_OnEnter orig, FireSeekingArrow self) { if (self != null) { self.orbDamageCoefficient = damage; self.orbProcCoefficient = procCoefficient; self.baseDuration = fireRate; } orig.Invoke(self); } } } namespace HIFUHuntressTweaks.Misc { public class FreeSprint : MiscBase { public override string Name => ":: Misc : 360 Degree Sprint"; public override void Init() { base.Init(); } public override void Hooks() { Changes(); } public static void Changes() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) CharacterBody component = LegacyResourcesAPI.Load<GameObject>("prefabs/characterbodies/HuntressBody").GetComponent<CharacterBody>(); component.bodyFlags = (BodyFlags)(component.bodyFlags | 0x20); } } }