Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of HIFUCommandoTweaks v1.2.0
HIFUCommandoTweaks.dll
Decompiled a year agousing System; using System.Collections; 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.Commando; using EntityStates.Commando.CommandoWeapon; using HarmonyLib; using IL.EntityStates.Commando.CommandoWeapon; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.EntityStates; using On.EntityStates.Commando; using On.EntityStates.Commando.CommandoWeapon; 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("HIFUCommandoTweaks")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("HIFUCommandoTweaks")] [assembly: AssemblyTitle("HIFUCommandoTweaks")] [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 HIFUCommandoTweaks { 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.HIFUCommandoTweaks", "HIFUCommandoTweaks", "1.2.0")] public class Main : BaseUnityPlugin { public const string PluginGUID = "HIFU.HIFUCommandoTweaks"; public const string PluginAuthor = "HIFU"; public const string PluginName = "HIFUCommandoTweaks"; public const string PluginVersion = "1.2.0"; public static ConfigFile HCTConfig; public static ConfigFile HCTBackupConfig; public static ManualLogSource HCTLogger; 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 HCTLogger = ((BaseUnityPlugin)this).Logger; HCTConfig = ((BaseUnityPlugin)this).Config; HCTBackupConfig = new ConfigFile(Paths.ConfigPath + "\\HIFU.HIFUCommandoTweaks.Backup.cfg", true); HCTBackupConfig.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 = HCTConfig.Bind<bool>("Config", "Enable Auto Config Sync", true, "Disabling this would stop HIFUCommandoTweaks from syncing config whenever a new version is found."); _preVersioning = !((Dictionary<ConfigDefinition, string>)AccessTools.DeclaredPropertyGetter(typeof(ConfigFile), "OrphanedEntries").Invoke(HCTConfig, null)).Keys.Any((ConfigDefinition x) => x.Key == "Latest Version"); latestVersion = HCTConfig.Bind<string>("Config", "Latest Version", "1.2.0", "DO NOT CHANGE THIS"); if (enableAutoConfig.Value && (_preVersioning || latestVersion.Value != "1.2.0")) { latestVersion.Value = "1.2.0"; ConfigManager.VersionChanged = true; HCTLogger.LogInfo((object)"Config Autosync Enabled."); } IEnumerable<Type> enumerable = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(TweakBase)) select type; HCTLogger.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; HCTLogger.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.HCTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HCTBackupConfig, name); return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); Main.HCTLogger.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.HCTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HCTBackupConfig, name); return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); string text = "COMMANDO_" + SkillToken.ToUpper() + "_DESCRIPTION"; LanguageAPI.Add(text, DescText); Main.HCTLogger.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 HIFUCommandoTweaks.Skills { public class FragGrenade : TweakBase { public static float Damage; public static float AoE; public static bool RemoveFalloff; public static bool Ignite; public static bool NewFeedback; public override string Name => ": Special :: Frag Grenade"; public override string SkillToken => "special_alt1"; public override string DescText => (Ignite ? "<style=cIsDamage>Ignite</style>. " : "") + "Throw a grenade that explodes for <style=cIsDamage>" + d(Damage) + " damage</style>. Can hold up to 2."; public override void Init() { Damage = ConfigOption(6f, "Damage", "Decimal. Vanilla is 7"); AoE = ConfigOption(11f, "Area of Effect", "Vanilla is 11"); RemoveFalloff = ConfigOption(value: true, "Remove Damage Falloff?", "Vanilla is false"); Ignite = ConfigOption(value: true, "Ignite?", "Vanilla is false"); NewFeedback = ConfigOption(value: true, "Use new SFX and VFX?", "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(); GenericProjectileBaseState.OnEnter += new hook_OnEnter(GenericProjectileBaseState_OnEnter); } private void GenericProjectileBaseState_OnEnter(orig_OnEnter orig, GenericProjectileBaseState self) { if (self is ThrowGrenade) { 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) //IL_0026: 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_0056: 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_0065: 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_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Expected O, but got Unknown //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Expected O, but got Unknown //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Unknown result type (might be due to invalid IL or missing references) //IL_02a5: Unknown result type (might be due to invalid IL or missing references) //IL_02b5: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Unknown result type (might be due to invalid IL or missing references) //IL_0307: Unknown result type (might be due to invalid IL or missing references) //IL_0359: Unknown result type (might be due to invalid IL or missing references) //IL_0369: Unknown result type (might be due to invalid IL or missing references) //IL_0385: Unknown result type (might be due to invalid IL or missing references) //IL_038a: Unknown result type (might be due to invalid IL or missing references) //IL_038e: Unknown result type (might be due to invalid IL or missing references) //IL_0393: Unknown result type (might be due to invalid IL or missing references) //IL_03ba: Unknown result type (might be due to invalid IL or missing references) //IL_03bf: Unknown result type (might be due to invalid IL or missing references) //IL_0402: Unknown result type (might be due to invalid IL or missing references) //IL_0407: Unknown result type (might be due to invalid IL or missing references) //IL_0427: Unknown result type (might be due to invalid IL or missing references) //IL_0431: Unknown result type (might be due to invalid IL or missing references) //IL_044c: Unknown result type (might be due to invalid IL or missing references) //IL_0456: Unknown result type (might be due to invalid IL or missing references) //IL_0499: Unknown result type (might be due to invalid IL or missing references) //IL_049e: Unknown result type (might be due to invalid IL or missing references) //IL_04a7: Unknown result type (might be due to invalid IL or missing references) //IL_04ae: Expected O, but got Unknown GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/CommandoGrenadeProjectile.prefab").WaitForCompletion(); ProjectileImpactExplosion component = val.GetComponent<ProjectileImpactExplosion>(); if (RemoveFalloff) { ((ProjectileExplosion)component).falloffModel = (FalloffModel)0; } ((ProjectileExplosion)component).blastRadius = AoE; if (Ignite) { ProjectileDamage component2 = val.GetComponent<ProjectileDamage>(); component2.damageType = DamageTypeCombo.op_Implicit((DamageType)128); SkillDef val2 = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Commando/ThrowGrenade.asset").WaitForCompletion(); val2.keywordTokens = new string[1] { "KEYWORD_IGNITE" }; } if (NewFeedback) { GameObject val3 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/OmniExplosionVFXCommandoGrenade.prefab").WaitForCompletion(); val3.AddComponent<GrenadeSFXSexerController>(); Transform transform = val3.transform; Transform child = transform.GetChild(0); child.localScale = Vector3.one * (AoE / 4.4f); EmissionModule emission = ((Component)child).GetComponent<ParticleSystem>().emission; Burst burst = ((EmissionModule)(ref emission)).GetBurst(0); MinMaxCurve count = ((Burst)(ref burst)).count; ((MinMaxCurve)(ref count)).constant = 6f; Transform val4 = transform.Find("Nova Sphere"); val4.localScale = Vector3.one * (AoE / 4f); ParticleSystem component3 = ((Component)val4).GetComponent<ParticleSystem>(); MainModule main = component3.main; MinMaxCurve startLifetime = ((MainModule)(ref main)).startLifetime; ((MinMaxCurve)(ref startLifetime)).constant = 0.15f; SizeOverLifetimeModule sizeOverLifetime = component3.sizeOverLifetime; ((SizeOverLifetimeModule)(ref sizeOverLifetime)).size = new MinMaxCurve(1f, new AnimationCurve((Keyframe[])(object)new Keyframe[3] { new Keyframe(0f, 1f), new Keyframe(0.66f, 1f), new Keyframe(1f, 0f) })); ParticleSystemRenderer component4 = ((Component)val4).GetComponent<ParticleSystemRenderer>(); Material val5 = new Material(Addressables.LoadAssetAsync<Material>((object)"RoR2/Base/Common/VFX/matCryoCanisterSphere.mat").WaitForCompletion()); val5.SetColor("_TintColor", Color32.op_Implicit(new Color32(byte.MaxValue, (byte)88, (byte)0, byte.MaxValue))); val5.SetTexture("_RemapTex", (Texture)(object)Addressables.LoadAssetAsync<Texture2D>((object)"RoR2/DLC1/VoidSurvivor/texRampVoidSurvivorCorrupted3.png").WaitForCompletion()); val5.SetFloat("_InvFade", 0.06039937f); val5.SetFloat("_SoftPower", 0.2511877f); val5.SetFloat("_Boost", 0.3f); val5.SetFloat("_RimPower", 2.720645f); val5.SetFloat("_RimStrength", 2.668566f); ((Renderer)component4).material = val5; Transform val6 = transform.Find("Nova Sphere (1)"); val6.localScale = Vector3.one * (AoE / 3f); ((Renderer)((Component)val6).GetComponent<ParticleSystemRenderer>()).material = val5; ((Component)val6).gameObject.SetActive(false); Light component5 = ((Component)transform.Find("Point Light")).GetComponent<Light>(); component5.color = Color32.op_Implicit(new Color32(byte.MaxValue, (byte)153, (byte)0, byte.MaxValue)); component5.range = AoE * 3f / 4f; ((Component)component5).GetComponent<LightIntensityCurve>().timeMax = 0.5f; component5.intensity = 150f; Transform val7 = transform.Find("Dash, Bright"); val7.localScale = Vector3.one * (AoE / 3.67f); MainModule main2 = ((Component)transform.Find("Unscaled Flames")).GetComponent<ParticleSystem>().main; MinMaxCurve startSize = ((MainModule)(ref main2)).startSize; ((MinMaxCurve)(ref startSize)).constantMin = AoE; ((MinMaxCurve)(ref startSize)).constantMax = AoE * 1.3f; GameObject val8 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/CommandoGrenadeGhost.prefab").WaitForCompletion(); Transform transform2 = val8.transform; Light component6 = ((Component)transform2.Find("Point Light")).GetComponent<Light>(); component6.range = AoE; component6.color = Color32.op_Implicit(new Color32((byte)53, (byte)82, (byte)146, byte.MaxValue)); ObjectScaleCurve component7 = ((Component)transform2.Find("mdlCommandoGrenade")).GetComponent<ObjectScaleCurve>(); component7.baseScale = Vector3.one * 3f; Transform val9 = transform2.Find("Pulse"); val9.localScale = Vector3.one * 1.5f; TrailRenderer component8 = ((Component)transform2.Find("Helix").GetChild(1)).GetComponent<TrailRenderer>(); component8.widthMultiplier = 0.2f; component8.time = 0.5f; Material val10 = new Material(Addressables.LoadAssetAsync<Material>((object)"RoR2/Base/Huntress/matHuntressArrowTrail.mat").WaitForCompletion()); val10.SetFloat("_Boost", 5.6f); ((Renderer)component8).material = val10; } } } public class GrenadeSFXSexerController : MonoBehaviour { public void OnEnable() { Util.PlaySound("Play_bleedOnCritAndExplode_explode", ((Component)this).gameObject); Util.PlaySound("Play_bleedOnCritAndExplode_explode", ((Component)this).gameObject); Util.PlaySound("Play_clayboss_M1_explo", ((Component)this).gameObject); Util.PlaySound("Play_captain_m1_hit", ((Component)this).gameObject); ((MonoBehaviour)this).StartCoroutine(FireAftershock()); } public IEnumerator FireAftershock() { if (FragGrenade.Ignite) { yield return (object)new WaitForSeconds(0.2f); Util.PlaySound("Play_lemurianBruiser_m2_loop", ((Component)this).gameObject); yield return (object)new WaitForSeconds(0.3f); Util.PlaySound("Stop_lemurianBruiser_m2_loop", ((Component)this).gameObject); } } } public class PhaseRound : TweakBase { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnEnter <>9__11_0; internal void <Changes>b__11_0(orig_OnEnter orig, GenericProjectileBaseState self) { if (self is FireFMJ) { self.damageCoefficient = Damage; self.baseDuration = 0.25f; self.force = 3000f; } orig.Invoke(self); } } public static float Damage; public static float RampingDamage; public static float Size; public override string Name => ": Secondary : Phase Round"; public override string SkillToken => "secondary"; public override string DescText => "Fire a <style=cIsDamage>piercing</style> bullet for <style=cIsDamage>" + d(Damage) + " damage</style>. Deals <style=cIsDamage>40%</style> more total damage for each enemy pierced."; public override void Init() { Damage = ConfigOption(4.5f, "Damage", "Decimal. Vanilla is 3"); Size = ConfigOption(2f, "Size Multiplier", "Vanilla is 1"); base.Init(); } public override void Hooks() { Changes(); } 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) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //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_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Expected O, but got Unknown GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/FMJRamping.prefab").WaitForCompletion(); GameObject val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Commando/FMJRampingGhost.prefab").WaitForCompletion(); val.transform.localScale = new Vector3(Size, Size, Size); val2.transform.localScale = new Vector3(Size, Size, Size); ProjectileSimple component = val.GetComponent<ProjectileSimple>(); component.desiredForwardSpeed = 200f; object obj = <>c.<>9__11_0; if (obj == null) { hook_OnEnter val3 = delegate(orig_OnEnter orig, GenericProjectileBaseState self) { if (self is FireFMJ) { self.damageCoefficient = Damage; self.baseDuration = 0.25f; self.force = 3000f; } orig.Invoke(self); }; <>c.<>9__11_0 = val3; obj = (object)val3; } GenericProjectileBaseState.OnEnter += (hook_OnEnter)obj; Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Commando/CommandoBodyFireFMJ.asset").WaitForCompletion().mustKeyPress = true; } } public class SuppressiveFire : TweakBase { public static float Damage; public static float FireRate; public static float Cooldown; public static int ShotCount; public static bool Ignite; public override string Name => ": Special : Suppressive Fire"; public override string SkillToken => "special"; public override string DescText => "<style=cIsDamage>Stunning</style>. " + (Ignite ? "<style=cIsDamage>Ignite</style>." : "") + " Fire repeatedly for <style=cIsDamage>" + d(Damage) + " damage</style> per bullet. The number of shots increases with attack speed."; public override void Init() { Damage = ConfigOption(1.5f, "Damage", "Decimal. Vanilla is 1"); FireRate = ConfigOption(0.1f, "Fire Rate", "Vanilla is 0.15"); Cooldown = ConfigOption(7f, "Cooldown", "Vanilla is 9"); ShotCount = ConfigOption(8, "Shot Count", "Vanilla is 6"); Ignite = ConfigOption(value: true, "Ignite?", "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 //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown Changes(); FireBarrage.OnEnter += new hook_OnEnter(FireBarrage_OnEnter); if (Ignite) { FireBarrage.FireBullet += new Manipulator(FireBarrage_FireBullet); } } private void FireBarrage_FireBullet(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 32) })) { int index = val.Index; val.Index = index + 1; val.EmitDelegate<Func<int, int>>((Func<int, int>)((int useless) => 160)); } else { Main.HCTLogger.LogError((object)"Failed to apply Suppressive Fire Ignite hook"); } } private void FireBarrage_OnEnter(orig_OnEnter orig, FireBarrage self) { FireBarrage.baseBulletCount = ShotCount; FireBarrage.baseDurationBetweenShots = FireRate; FireBarrage.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) SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Commando/CommandoBodyBarrage.asset").WaitForCompletion(); val.baseRechargeInterval = Cooldown; if (Ignite) { val.keywordTokens = new string[2] { "KEYWORD_STUNNING", "KEYWORD_IGNITE" }; } } } public class TacticalDive : TweakBase { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnEnter <>9__18_0; internal void <Changes>b__18_0(orig_OnEnter orig, DodgeState self) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) self.initialSpeedCoefficient = InitialSpeedCoefficient; self.finalSpeedCoefficient = EndSpeedCoefficient; if (ArmorBuff) { ((EntityState)self).characterBody.AddTimedBuffAuthority(Buffs.ArmorBoost.buffIndex, ArmorBuffDuration); } orig.Invoke(self); } } public static float Cooldown; public static float InitialSpeedCoefficient; public static float EndSpeedCoefficient; public static int Charges; public static int ChargesToRecharge; public static bool ArmorBuff; public static float ArmorBuffDuration; public override string Name => ": Utility : Tactical Dive"; public override string SkillToken => "utility"; public override string DescText => "<style=cIsUtility>Roll</style> a" + ((InitialSpeedCoefficient + EndSpeedCoefficient >= 12f) ? " long" : ((InitialSpeedCoefficient + EndSpeedCoefficient >= 8f) ? " medium" : " short")) + " distance." + ((Charges > 1) ? (" Can store up to <style=cIsUtility>" + Charges + "</style> charges.") : ""); public override void Init() { Charges = ConfigOption(1, "Charges", "Vanilla is 1"); ChargesToRecharge = ConfigOption(1, "Charges to Recharge", "Vanilla is 1"); Cooldown = ConfigOption(4f, "Cooldown", "Vanilla is 4"); InitialSpeedCoefficient = ConfigOption(5f, "Initial Speed Coefficient", "Vanilla is 5"); EndSpeedCoefficient = ConfigOption(2.65f, "End Speed Coefficient", "Vanilla is 2.5"); ArmorBuff = ConfigOption(value: true, "Enable Armor Buff?", "Vanilla is false"); ArmorBuffDuration = ConfigOption(0.5f, "Armor Buff Dur", "Vanilla is 0"); 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 //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown Changes(); DodgeState.OnEnter += new hook_OnEnter(DodgeState_OnEnter); DodgeState.FixedUpdate += new hook_FixedUpdate(DodgeState_FixedUpdate); DodgeState.OnExit += new hook_OnExit(DodgeState_OnExit); } private void DodgeState_OnExit(orig_OnExit orig, DodgeState self) { ((EntityState)self).characterBody.isSprinting = true; orig.Invoke(self); } private void DodgeState_FixedUpdate(orig_FixedUpdate orig, DodgeState self) { ((EntityState)self).characterBody.isSprinting = true; orig.Invoke(self); } private void DodgeState_OnEnter(orig_OnEnter orig, DodgeState self) { ((EntityState)self).characterBody.isSprinting = true; orig.Invoke(self); } public static void Changes() { //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__18_0; if (obj == null) { hook_OnEnter val = delegate(orig_OnEnter orig, DodgeState self) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) self.initialSpeedCoefficient = InitialSpeedCoefficient; self.finalSpeedCoefficient = EndSpeedCoefficient; if (ArmorBuff) { ((EntityState)self).characterBody.AddTimedBuffAuthority(Buffs.ArmorBoost.buffIndex, ArmorBuffDuration); } orig.Invoke(self); }; <>c.<>9__18_0 = val; obj = (object)val; } DodgeState.OnEnter += (hook_OnEnter)obj; SkillDef val2 = LegacyResourcesAPI.Load<SkillDef>("SkillDefs/CommandoBody/CommandoBodyRoll"); val2.baseMaxStock = Charges; val2.rechargeStock = ChargesToRecharge; val2.baseRechargeInterval = Cooldown; val2.cancelSprintingOnActivation = false; } } } namespace HIFUCommandoTweaks.Misc { public class BloomAndSpread : MiscBase { [CompilerGenerated] private static class <>O { public static hook_OnEnter <0>__FirePistol2_OnEnter; } public override string Name => ":: Misc : Bloom and Spread"; public override void Init() { base.Init(); } public override void Hooks() { Changes(); } public static void Changes() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown object obj = <>O.<0>__FirePistol2_OnEnter; if (obj == null) { hook_OnEnter val = FirePistol2_OnEnter; <>O.<0>__FirePistol2_OnEnter = val; obj = (object)val; } FirePistol2.OnEnter += (hook_OnEnter)obj; } private static void FirePistol2_OnEnter(orig_OnEnter orig, FirePistol2 self) { FirePistol2.spreadBloomValue = 0.275f; FirePistol2.recoilAmplitude = 1.45f; orig.Invoke(self); } } }