Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of HIFULoaderTweaks v1.1.6
HIFULoaderTweaks.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 BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using EntityStates.Loader; using HarmonyLib; using Microsoft.CodeAnalysis; using On.EntityStates; using On.EntityStates.Loader; using On.RoR2; 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("HIFULoaderTweaks")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+4d7154fe3f0d979e2c36e00123e1830f3d3a5859")] [assembly: AssemblyProduct("HIFULoaderTweaks")] [assembly: AssemblyTitle("HIFULoaderTweaks")] [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 HIFULoaderTweaks { 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.*/)] [BepInPlugin("HIFU.HIFULoaderTweaks", "HIFULoaderTweaks", "1.1.5")] public class Main : BaseUnityPlugin { public const string PluginGUID = "HIFU.HIFULoaderTweaks"; public const string PluginAuthor = "HIFU"; public const string PluginName = "HIFULoaderTweaks"; public const string PluginVersion = "1.1.5"; public static ConfigFile HLTConfig; public static ConfigFile HLTBackupConfig; public static ManualLogSource HLTLogger; 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 HLTLogger = ((BaseUnityPlugin)this).Logger; HLTConfig = ((BaseUnityPlugin)this).Config; HLTBackupConfig = new ConfigFile(Paths.ConfigPath + "\\HIFU.HIFULoaderTweaks.Backup.cfg", true); HLTBackupConfig.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 = HLTConfig.Bind<bool>("Config", "Enable Auto Config Sync", true, "Disabling this would stop HIFULoaderTweaks from syncing config whenever a new version is found."); _preVersioning = !((Dictionary<ConfigDefinition, string>)AccessTools.DeclaredPropertyGetter(typeof(ConfigFile), "OrphanedEntries").Invoke(HLTConfig, null)).Keys.Any((ConfigDefinition x) => x.Key == "Latest Version"); latestVersion = HLTConfig.Bind<string>("Config", "Latest Version", "1.1.5", "DO NOT CHANGE THIS"); if (enableAutoConfig.Value && (_preVersioning || latestVersion.Value != "1.1.5")) { latestVersion.Value = "1.1.5"; ConfigManager.VersionChanged = true; HLTLogger.LogInfo((object)"Config Autosync Enabled."); } IEnumerable<Type> enumerable = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(TweakBase)) select type; HLTLogger.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; HLTLogger.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 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.HLTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HLTBackupConfig, name); return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); Main.HLTLogger.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.HLTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HLTBackupConfig, name); return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); string text = "LOADER_" + SkillToken.ToUpper() + "_DESCRIPTION"; LanguageAPI.Add(text, DescText); Main.HLTLogger.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 HIFULoaderTweaks.Skills { public class ChargedGauntlet : TweakBase { public static float minDamage; public static float maxDamage; public static float chargeRate; public static float speedCoeff; public static float cooldown; public static bool formula; public override string Name => ": Utility : Charged Gauntlet"; public override string SkillToken => "utility"; public override string DescText => "<style=cIsUtility>Heavy</style>. Charge up a <style=cIsUtility>piercing</style> punch for <style=cIsDamage>" + d(minDamage) + "-" + d(maxDamage) + " damage</style>."; public override void Init() { minDamage = ConfigOption(5f, "Minimum Damage", "Decimal. Vanilla is ???"); maxDamage = ConfigOption(18f, "Maximum Damage", "Decimal. Vanilla is ???"); chargeRate = ConfigOption(2f, "Charge Duration", "Vanilla is 2.5"); speedCoeff = ConfigOption(0.45f, "Speed Coefficient", "Decimal. Vanilla is 0.3"); cooldown = ConfigOption(5f, "Cooldown", "Vanilla is 5"); formula = ConfigOption(value: true, "Damage Formula", "Damage based on total charge, MinDamage and MaxDamage + SpeedCoeff * (Current velocity - 20~90, depending on total charge)"); 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 BaseChargeFist.OnEnter += new hook_OnEnter(BaseChargeFist_OnEnter); BaseSwingChargedFist.OnEnter += new hook_OnEnter(BaseSwingChargedFist_OnEnter); Changes(); } private void BaseSwingChargedFist_OnEnter(orig_OnEnter orig, BaseSwingChargedFist self) { if (self is SwingChargedFist) { BaseSwingChargedFist.velocityDamageCoefficient = speedCoeff; orig.Invoke(self); self.bonusDamage -= BaseSwingChargedFist.velocityDamageCoefficient * ((BaseState)self).damageStat * Mathf.Lerp(self.minLungeSpeed, self.maxLungeSpeed, self.charge); ((BasicMeleeAttack)self).damageCoefficient = Mathf.Lerp(minDamage, maxDamage, self.charge); } else { orig.Invoke(self); } } private void BaseChargeFist_OnEnter(orig_OnEnter orig, BaseChargeFist self) { if (self is ChargeFist) { self.baseChargeDuration = chargeRate; } orig.Invoke(self); } private void Changes() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) SteppedSkillDef val = Addressables.LoadAssetAsync<SteppedSkillDef>((object)"RoR2/Base/Loader/ChargeFist.asset").WaitForCompletion(); ((SkillDef)val).baseRechargeInterval = cooldown; } } public class GrappleFist : TweakBase { public static float cooldown; public static float range; public override string Name => ": Secondary : Grapple Fist"; public override string SkillToken => "secondary"; public override string DescText => "Fire your gauntlet forward, <style=cIsUtility>pulling</style> you to the target."; public override void Init() { cooldown = ConfigOption(5f, "Cooldown", "Vanilla is 5"); range = ConfigOption(80f, "Max Range", "Vanilla is 80"); base.Init(); } public override void Hooks() { Changes(); } private void Changes() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Loader/FireHook.asset").WaitForCompletion(); val.baseRechargeInterval = cooldown; GameObject val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Loader/LoaderHook.prefab").WaitForCompletion(); ProjectileGrappleController component = val2.GetComponent<ProjectileGrappleController>(); component.maxTravelDistance = range; } } public class Knuckleboom : TweakBase { public static float damage; public static float fireRate; public static float burstDamage; public static float burstAoE; public static float barrierGain; public override string Name => ": Primary : Knuckleboom"; public override string SkillToken => "primary"; public override string DescText => "Swing at nearby enemies for <style=cIsDamage>" + d(damage) + " damage</style>. Every third hit knocks up for an additional <style=cIsDamage>" + d(burstDamage) + " damage</style> in a large radius."; public override void Init() { damage = ConfigOption(1.7f, "Damage", "Decimal. Vanilla is 3.2"); burstDamage = ConfigOption(2.3f, "Third Hit Damage", "Decimal. Vanilla is 0"); burstAoE = ConfigOption(13f, "Third Hit AoE", "Vanilla is 0"); fireRate = ConfigOption(2.5f, "Fire Rate", "Vanilla is 1.66666667"); barrierGain = ConfigOption(0.033f, "Barrier Gain per Hit", "Decimal. Vanilla is 0.05"); base.Init(); } public override void Hooks() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown BasicMeleeAttack.OnEnter += new hook_OnEnter(BasicMeleeAttack_OnEnter); BasicMeleeAttack.OnMeleeHitAuthority += new hook_OnMeleeHitAuthority(BasicMeleeAttack_OnMeleeHitAuthority); LoaderMeleeAttack.OnMeleeHitAuthority += new hook_OnMeleeHitAuthority(LoaderMeleeAttack_OnMeleeHitAuthority); } private void LoaderMeleeAttack_OnMeleeHitAuthority(orig_OnMeleeHitAuthority orig, LoaderMeleeAttack self) { LoaderMeleeAttack.barrierPercentagePerHit = barrierGain; orig.Invoke(self); } private void BasicMeleeAttack_OnMeleeHitAuthority(orig_OnMeleeHitAuthority orig, BasicMeleeAttack self) { if (self is LoaderMeleeAttack) { ((Component)((EntityState)self).characterBody).gameObject.GetComponent<KnuckleboomButBased>().HitCount++; } orig.Invoke(self); } private void BasicMeleeAttack_OnEnter(orig_OnEnter orig, BasicMeleeAttack self) { if (self is LoaderMeleeAttack) { self.baseDuration = 1f / fireRate; self.damageCoefficient = damage; self.pushAwayForce = 50f; if ((Object)(object)((Component)((EntityState)self).characterBody).gameObject.GetComponent<KnuckleboomButBased>() == (Object)null) { ((Component)((EntityState)self).characterBody).gameObject.AddComponent<KnuckleboomButBased>(); } } orig.Invoke(self); } } public class KnuckleboomButBased : MonoBehaviour { public int HitCount; public CharacterBody body; public void Start() { body = ((Component)this).GetComponent<CharacterBody>(); } public void FixedUpdate() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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_0042: Expected O, but got Unknown //IL_0056: 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_006c: 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) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: 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) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) if (HitCount >= 3) { EffectManager.SpawnEffect(GroundSlam.blastEffectPrefab, new EffectData { origin = body.footPosition, scale = Knuckleboom.burstAoE }, true); if (Util.HasEffectiveAuthority(((Component)this).gameObject)) { new BlastAttack { attacker = ((Component)body).gameObject, baseDamage = body.damage * Knuckleboom.burstDamage, baseForce = 50f, bonusForce = new Vector3(0f, 1500f, 0f), crit = body.RollCrit(), damageType = DamageTypeCombo.op_Implicit((DamageType)0), procCoefficient = 1f, radius = Knuckleboom.burstAoE, position = body.footPosition, attackerFiltering = (AttackerFiltering)2, teamIndex = body.teamComponent.teamIndex, falloffModel = (FalloffModel)0, impactEffect = EffectCatalog.FindEffectIndexFromPrefab(GroundSlam.blastImpactEffectPrefab) }.Fire(); } HitCount = 0; } } } public class M551Pylon : TweakBase { public static float damage; public static float cooldown; public static float aoe; public static float fireRate; public static float procCoefficient; public static int bounces; public static float lifetime; public override string Name => ": Special : M551 Pylon"; public override string SkillToken => "special"; public override string DescText => "Throw a floating pylon that repeatedly <style=cIsDamage>zaps</style> up to <style=cIsDamage>3</style> nearby enemies for <style=cIsDamage>" + d(damage) + " damage</style>. Can be <style=cIsUtility>grappled</style>."; public override void Init() { damage = ConfigOption(0.5f, "Damage", "Decimal. Vanilla is 1"); aoe = ConfigOption(35f, "Area of Effect", "Vanilla is 25"); cooldown = ConfigOption(20f, "Cooldown", "Vanilla is 20"); fireRate = ConfigOption(3f, "Fire Rate", "Vanilla is 1"); procCoefficient = ConfigOption(0.4f, "Proc Coefficient", "Vanilla is 0.5"); bounces = ConfigOption(1, "Bounce Count", "Vanilla is 0"); lifetime = ConfigOption(6f, "Lifetime", "Vanilla is 15"); base.Init(); } public override void Hooks() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown Changes(); ThrowPylon.OnEnter += new hook_OnEnter(ThrowPylon_OnEnter); } private void ThrowPylon_OnEnter(orig_OnEnter orig, ThrowPylon self) { ThrowPylon.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) //IL_0025: 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) SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Loader/ThrowPylon.asset").WaitForCompletion(); val.baseRechargeInterval = cooldown; GameObject val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Loader/LoaderPylon.prefab").WaitForCompletion(); ProjectileProximityBeamController component = val2.GetComponent<ProjectileProximityBeamController>(); component.attackInterval = 1f / fireRate; component.attackRange = aoe; component.procCoefficient = procCoefficient; component.bounces = bounces; ProjectileSimple component2 = val2.GetComponent<ProjectileSimple>(); component2.lifetime = lifetime; } } public class SpikedFist : TweakBase { public static float massLimit; public static float cooldown; public static float range; public override string Name => ": Secondary :: Spiked Fist"; public override string SkillToken => "yankhook"; public override string DescText => "<style=cIsDamage>Stunning</style>. Fire your gauntlet forward, dealing <style=cIsDamage>320% damage</style>. <style=cIsUtility>Pulls</style> you to heavy targets. Light targets are <style=cIsUtility>pulled to YOU</style> instead."; public override void Init() { massLimit = ConfigOption(500f, "Mass Limit", "Vanilla is 250"); cooldown = ConfigOption(5f, "Cooldown", "Vanilla is 5"); range = ConfigOption(80f, "Max Range", "Vanilla is 80"); base.Init(); } public override void Hooks() { Changes(); } private void Changes() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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) GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Loader/LoaderYankHook.prefab").WaitForCompletion(); ProjectileGrappleController component = val.GetComponent<ProjectileGrappleController>(); component.yankMassLimit = massLimit; component.maxTravelDistance = range; SkillDef val2 = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Loader/FireYankHook.asset").WaitForCompletion(); val2.baseRechargeInterval = cooldown; } } public class ThunderGauntlet : TweakBase { public static float damage; public static float chargeRate; public static float speedCoeff; public static float cooldown; public static bool formula; public override string Name => ": Utility :: Thunder Gauntlet"; public override string SkillToken => "utility_alt1"; public override string DescText => "<style=cIsUtility>Heavy</style>. Charge up a <style=cIsUtility>single-target</style> punch for <style=cIsDamage>" + d(damage) + " damage</style> that <style=cIsDamage>shocks</style> enemies in a cone for <style=cIsDamage>900% damage</style>."; public override void Init() { damage = ConfigOption(14f, "Damage", "Decimal. Vanilla is ???"); chargeRate = ConfigOption(0.4f, "Charge Duration", "Vanilla is 0.4"); speedCoeff = ConfigOption(0.17f, "Speed Coefficient", "Decimal. Vanilla is 0.3"); cooldown = ConfigOption(5f, "Cooldown", "Vanilla is 5"); formula = ConfigOption(value: true, "Damage Formula", "Damage + SpeedCoeff * (Current velocity - 90)"); 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 BaseChargeFist.OnEnter += new hook_OnEnter(BaseChargeFist_OnEnter); BaseSwingChargedFist.OnEnter += new hook_OnEnter(BaseSwingChargedFist_OnEnter); Changes(); } private void BaseSwingChargedFist_OnEnter(orig_OnEnter orig, BaseSwingChargedFist self) { if (self is SwingZapFist) { BaseSwingChargedFist.velocityDamageCoefficient = speedCoeff; ((BasicMeleeAttack)self).damageCoefficient = damage; orig.Invoke(self); } else { orig.Invoke(self); } } private void BaseChargeFist_OnEnter(orig_OnEnter orig, BaseChargeFist self) { if (self is ChargeZapFist) { self.baseChargeDuration = chargeRate; } orig.Invoke(self); } private void Changes() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) SteppedSkillDef val = Addressables.LoadAssetAsync<SteppedSkillDef>((object)"RoR2/Base/Loader/ChargeZapFist.asset").WaitForCompletion(); ((SkillDef)val).baseRechargeInterval = cooldown; } } public class Thunderslam : TweakBase { public static float damage; public static float cooldown; public static float aoe; public static float yVelocityCoeff; public static bool formula; public static BuffDef fallDamageReduction; public override string Name => ": Special :: Thunderslam"; public override string SkillToken => "special_alt"; public override string DescText => "<style=cIsUtility>Very Heavy</style>. <style=cIsDamage>Stunning</style>. Slam your fists down, dealing <style=cIsDamage>" + d(damage) + "</style> damage on impact."; public override void Init() { damage = ConfigOption(4f, "Damage", "Decimal. Vanilla is 20"); aoe = ConfigOption(13f, "Area of Effect", "Vanilla is 11"); cooldown = ConfigOption(9f, "Cooldown", "Vanilla is 8"); yVelocityCoeff = ConfigOption(0.23f, "Y Axis Speed Coefficient", "Vanilla is 0"); formula = ConfigOption(value: true, "Damage Formula", "if Damage + Y Velocity * -1 * YVelocityCoeff >=\nDamage + YVelocityCoeff * 25,\nset the Damage to that"); fallDamageReduction = ScriptableObject.CreateInstance<BuffDef>(); fallDamageReduction.isHidden = true; fallDamageReduction.isDebuff = false; fallDamageReduction.canStack = false; fallDamageReduction.isCooldown = false; ContentAddition.AddBuffDef(fallDamageReduction); base.Init(); } public override void Hooks() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown Changes(); GroundSlam.OnEnter += new hook_OnEnter(GroundSlam_OnEnter); GroundSlam.FixedUpdate += new hook_FixedUpdate(GroundSlam_FixedUpdate); GroundSlam.OnExit += new hook_OnExit(GroundSlam_OnExit); GlobalEventManager.OnCharacterHitGroundServer += new hook_OnCharacterHitGroundServer(GlobalEventManager_OnCharacterHitGroundServer); } private void GlobalEventManager_OnCharacterHitGroundServer(orig_OnCharacterHitGroundServer orig, GlobalEventManager self, CharacterBody characterBody, HitGroundInfo info) { //IL_0031: 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_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) if (characterBody.HasBuff(fallDamageReduction)) { ref Vector3 velocity = ref info.velocity; velocity *= 0.75f; } orig.Invoke(self, characterBody, info); } private void GroundSlam_OnExit(orig_OnExit orig, GroundSlam self) { GroundSlam.blastDamageCoefficient = damage; orig.Invoke(self); if (Object.op_Implicit((Object)(object)((EntityState)self).characterBody)) { ((EntityState)self).characterBody.RemoveBuff(fallDamageReduction); } } private void GroundSlam_FixedUpdate(orig_FixedUpdate orig, GroundSlam self) { if (((EntityState)self).isAuthority && Object.op_Implicit((Object)(object)((EntityState)self).characterMotor)) { float num = damage + ((EntityState)self).characterMotor.velocity.y * -1f * yVelocityCoeff; if (num >= damage + yVelocityCoeff * 25f) { GroundSlam.blastDamageCoefficient = num; } orig.Invoke(self); } } private void GroundSlam_OnEnter(orig_OnEnter orig, GroundSlam self) { GroundSlam.blastRadius = aoe; if (Object.op_Implicit((Object)(object)((EntityState)self).characterBody)) { ((EntityState)self).characterBody.AddBuff(fallDamageReduction); } 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) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) SteppedSkillDef val = Addressables.LoadAssetAsync<SteppedSkillDef>((object)"RoR2/Base/Loader/GroundSlam.asset").WaitForCompletion(); ((SkillDef)val).baseRechargeInterval = cooldown; LanguageAPI.Add("KEYWORD_VERY_HEAVY", "<style=cKeywordName>Very Heavy</style><style=cSub>The skill deals much more damage the faster you are falling. <color=#FF7F7F>Watch out for backblast</color>.</style>"); string[] keywordTokens = new string[1] { "KEYWORD_VERY_HEAVY" }; SkillFamily val2 = Addressables.LoadAssetAsync<SkillFamily>((object)"RoR2/Base/Loader/LoaderBodySpecialFamily.asset").WaitForCompletion(); val2.variants[1].skillDef.keywordTokens = keywordTokens; } } } namespace HIFULoaderTweaks.Misc { public class FallDamageReduction : MiscBase { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_TakeDamage <>9__5_0; internal void <Changes>b__5_0(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) if (damageInfo != null && ((Enum)damageInfo.damageType.damageType).HasFlag((Enum)(object)(DamageType)2097152) && Object.op_Implicit((Object)(object)self.body) && ((Object)self.body).name == "LoaderBody(Clone)") { damageInfo.damage *= 1f - fallDamageReduction; } orig.Invoke(self, damageInfo); } } public static float fallDamageReduction; public override string Name => ":: Misc : Scrap Barrier"; public override void Init() { fallDamageReduction = ConfigOption(0.6f, "Fall Damage Reduction", "Decimal. Vanilla is 1"); base.Init(); } public override void Hooks() { Changes(); } public static void Changes() { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: 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_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown object obj = <>c.<>9__5_0; if (obj == null) { hook_TakeDamage val = delegate(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) if (damageInfo != null && ((Enum)damageInfo.damageType.damageType).HasFlag((Enum)(object)(DamageType)2097152) && Object.op_Implicit((Object)(object)self.body) && ((Object)self.body).name == "LoaderBody(Clone)") { damageInfo.damage *= 1f - fallDamageReduction; } orig.Invoke(self, damageInfo); }; <>c.<>9__5_0 = val; obj = (object)val; } HealthComponent.TakeDamage += (hook_TakeDamage)obj; LanguageAPI.Add("LOADER_PASSIVE_DESCRIPTION", "The Loader has her fall damage <style=cIsUtility>reduced by " + fallDamageReduction * 100f + "%</style>. Striking enemies with the Loader's gauntlets grants a <style=cIsHealing>temporary barrier</style>."); GameObject val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Loader/LoaderBody.prefab").WaitForCompletion(); CharacterBody component = val2.GetComponent<CharacterBody>(); component.bodyFlags = (BodyFlags)(component.bodyFlags & -2); } } public class StatChanges : MiscBase { public static float baseMaxHealth; public static float armor; public override string Name => ":: Misc :: Base Stats"; public override void Init() { baseMaxHealth = ConfigOption(110f, "Base Max Health", "Vanilla is 160"); armor = ConfigOption(0f, "Base Armor", "Vanilla is 20"); base.Init(); } public override void Hooks() { Changes(); } private void Changes() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Loader/LoaderBody.prefab").WaitForCompletion(); CharacterBody component = val.GetComponent<CharacterBody>(); component.baseMaxHealth = baseMaxHealth; component.levelMaxHealth = baseMaxHealth * 0.3f; component.baseArmor = armor; } } }