Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of HIFUMercenaryTweaks v1.1.2
HIFUMercenaryTweaks.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.Merc; using EntityStates.Merc.Weapon; using HIFUMercenaryTweaks.Skills; using HarmonyLib; using IL.EntityStates.Merc; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.EntityStates.Merc; using On.EntityStates.Merc.Weapon; using R2API; using RoR2; using RoR2.Skills; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; [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("HIFUMercenaryTweaks")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("HIFUMercenaryTweaks")] [assembly: AssemblyTitle("HIFUMercenaryTweaks")] [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 HIFUMercenaryTweaks { 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; } } public static class Keywords { public static void Init() { LanguageAPI.Add("KEYWORD_FLEETING", "<style=cKeywordName>Fleeting</style><style=cSub><style=cIsDamage>Attack speed</style> increases <style=cIsDamage>skill damage</style> instead."); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("HIFU.HIFUMercenaryTweaks", "HIFUMercenaryTweaks", "1.1.2")] public class Main : BaseUnityPlugin { public const string PluginGUID = "HIFU.HIFUMercenaryTweaks"; public const string PluginAuthor = "HIFU"; public const string PluginName = "HIFUMercenaryTweaks"; public const string PluginVersion = "1.1.2"; public static ConfigFile HMTConfig; public static ConfigFile HMTBackupConfig; public static ManualLogSource HMTLogger; public static bool _preVersioning; public static ConfigEntry<bool> enableAutoConfig { get; set; } public static ConfigEntry<string> latestVersion { get; set; } public static ConfigEntry<bool> scaleSomeSkillDamageWithAttackSpeed { 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 //IL_029e: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Unknown result type (might be due to invalid IL or missing references) //IL_02cf: Unknown result type (might be due to invalid IL or missing references) //IL_02d4: Unknown result type (might be due to invalid IL or missing references) //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_02ea: Unknown result type (might be due to invalid IL or missing references) //IL_032a: 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) HMTLogger = ((BaseUnityPlugin)this).Logger; HMTConfig = ((BaseUnityPlugin)this).Config; HMTBackupConfig = new ConfigFile(Paths.ConfigPath + "\\HIFU.HIFUMercenaryTweaks.Backup.cfg", true); HMTBackupConfig.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 = HMTConfig.Bind<bool>("Config", "Enable Auto Config Sync", true, "Disabling this would stop HIFUMercenaryTweaks from syncing config whenever a new version is found."); _preVersioning = !((Dictionary<ConfigDefinition, string>)AccessTools.DeclaredPropertyGetter(typeof(ConfigFile), "OrphanedEntries").Invoke(HMTConfig, null)).Keys.Any((ConfigDefinition x) => x.Key == "Latest Version"); latestVersion = HMTConfig.Bind<string>("Config", "Latest Version", "1.1.2", "DO NOT CHANGE THIS"); if (enableAutoConfig.Value && (_preVersioning || latestVersion.Value != "1.1.2")) { latestVersion.Value = "1.1.2"; ConfigManager.VersionChanged = true; HMTLogger.LogInfo((object)"Config Autosync Enabled."); } scaleSomeSkillDamageWithAttackSpeed = ((BaseUnityPlugin)this).Config.Bind<bool>("Non-Special Skills :: Scaling", "Scale Damage with Attack Speed?", true, "Vanilla is false"); Keywords.Init(); IEnumerable<Type> enumerable = from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(TweakBase)) select type; HMTLogger.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; HMTLogger.LogInfo((object)"==+----------------==MISC==----------------+=="); foreach (Type item2 in enumerable2) { MiscBase miscBase = (MiscBase)Activator.CreateInstance(item2); if (ValidateMisc(miscBase)) { miscBase.Init(); } } if (Eviscerate.allowMovement) { GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Merc/MercBody.prefab").WaitForCompletion(); EntityStateMachine val2 = val.AddComponent<EntityStateMachine>(); val2.customName = "Evis"; val2.initialStateType = new SerializableEntityStateType(typeof(Idle)); val2.mainStateType = new SerializableEntityStateType(typeof(Idle)); NetworkStateMachine component = val.GetComponent<NetworkStateMachine>(); Array.Resize(ref component.stateMachines, component.stateMachines.Length + 1); component.stateMachines[component.stateMachines.Length - 1] = val2; SkillDef val3 = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Merc/MercBodyEvis.asset").WaitForCompletion(); val3.activationStateMachineName = "Evis"; } } 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 PERIPHERYVSWEEP() { } } 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.HMTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HMTBackupConfig, name); return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); Main.HMTLogger.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.HMTConfig.Bind<T>(Name, name, value, description); ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HMTBackupConfig, name); if (!done) { done = true; } return val.Value; } public abstract void Hooks(); public string d(float f) { return f * 100f + "%"; } public virtual void Init() { Hooks(); string text = "MERC_" + SkillToken.ToUpper() + "_DESCRIPTION"; LanguageAPI.Add(text, DescText); Main.HMTLogger.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 HIFUMercenaryTweaks.Skills { internal class BlindingAssault : TweakBase<BlindingAssault> { public static bool scaleDurationWithAttackSpeed; public override string Name => "Utility : Blinding Assault"; public override string SkillToken => "utility"; public override string DescText => (Main.scaleSomeSkillDamageWithAttackSpeed.Value ? "<style=cIsDamage>Fleeting</style>. " : "") + "<style=cIsDamage>Stunning</style>. Dash forward, dealing <style=cIsDamage>300% damage</style>. If you hit an enemy, <style=cIsDamage>you can dash again</style>, up to <style=cIsDamage>3</style> total."; public override void Init() { scaleDurationWithAttackSpeed = ConfigOption(value: false, "Scale animation speed with Attack 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_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 PrepAssaulter2.OnEnter += new hook_OnEnter(PrepAssaulter2_OnEnter); Assaulter2.OnEnter += new hook_OnEnter(Assaulter2_OnEnter); Assaulter2.AuthorityModifyOverlapAttack += new hook_AuthorityModifyOverlapAttack(Assaulter2_AuthorityModifyOverlapAttack); Changes(); } private void Assaulter2_AuthorityModifyOverlapAttack(orig_AuthorityModifyOverlapAttack orig, Assaulter2 self, OverlapAttack overlapAttack) { if (Main.scaleSomeSkillDamageWithAttackSpeed.Value && ((EntityState)self).isAuthority) { float damageCoefficient = 3f + 3f * ((((BaseState)self).attackSpeedStat - 1f) * (1f / 3f)); ((BasicMeleeAttack)self).damageCoefficient = damageCoefficient; } orig.Invoke(self, overlapAttack); } private void Assaulter2_OnEnter(orig_OnEnter orig, Assaulter2 self) { orig.Invoke(self); if (!scaleDurationWithAttackSpeed) { ((BasicMeleeAttack)self).duration = ((BasicMeleeAttack)self).baseDuration; } } private void PrepAssaulter2_OnEnter(orig_OnEnter orig, PrepAssaulter2 self) { orig.Invoke(self); if (!scaleDurationWithAttackSpeed) { self.duration = PrepAssaulter2.baseDuration; } } private void Changes() { //IL_002c: 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) if (Main.scaleSomeSkillDamageWithAttackSpeed.Value) { string[] keywordTokens = new string[2] { "KEYWORD_FLEETING", "KEYWORD_STUNNING" }; MercDashSkillDef val = Addressables.LoadAssetAsync<MercDashSkillDef>((object)"RoR2/Base/Merc/MercBodyAssaulter.asset").WaitForCompletion(); ((SkillDef)val).keywordTokens = keywordTokens; } } } public class Eviscerate : TweakBase<Eviscerate> { public static float damageCoefficient; public static float cooldown; public static bool allowMovement; public static bool ignoreAllies; public static bool removeCameraChanges; public override string Name => "Special : Eviscerate"; public override string SkillToken => "special"; public override string DescText => "Target the nearest enemy, attacking them for <style=cIsDamage>" + d(damageCoefficient) + " damage</style> repeatedly. <style=cIsUtility>You cannot be hit for the duration</style>."; public override void Init() { damageCoefficient = ConfigOption(1.3f, "Damage", "Decimal. Vanilla is 1.1"); allowMovement = ConfigOption(value: true, "Enable movement and using other skills?", "Vanilla is false"); ignoreAllies = ConfigOption(value: true, "Improve targetting and ignore allies?", "Vanilla is false"); removeCameraChanges = ConfigOption(value: true, "Remove camera changes?", "Vanilla is false"); cooldown = ConfigOption(7f, "Cooldown", "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_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown Evis.OnEnter += new hook_OnEnter(Evis_OnEnter); if (removeCameraChanges) { Evis.OnEnter += new Manipulator(Evis_OnEnter1); EvisDash.OnEnter += new Manipulator(EvisDash_OnEnter); } Evis.SearchForTarget += new hook_SearchForTarget(Evis_SearchForTarget); Evis.FixedUpdate += new hook_FixedUpdate(Evis_FixedUpdate); EvisDash.FixedUpdate += new hook_FixedUpdate(EvisDash_FixedUpdate); Changes(); } private void EvisDash_FixedUpdate(orig_FixedUpdate orig, EvisDash self) { //IL_004f: 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_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01ea: 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_0231: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Unknown result type (might be due to invalid IL or missing references) //IL_026a: Unknown result type (might be due to invalid IL or missing references) //IL_027e: Unknown result type (might be due to invalid IL or missing references) //IL_0285: Expected O, but got Unknown if (ignoreAllies) { self.stopwatch += Time.fixedDeltaTime; if (self.stopwatch > EvisDash.dashPrepDuration && !self.isDashing) { self.isDashing = true; self.dashVector = ((EntityState)self).inputBank.aimDirection; self.CreateBlinkEffect(Util.GetCorePosition(((EntityState)self).gameObject)); ((EntityState)self).PlayCrossfade("FullBody, Override", "EvisLoop", 0.1f); if (Object.op_Implicit((Object)(object)self.modelTransform)) { CharacterModel component = ((Component)self.modelTransform).GetComponent<CharacterModel>(); TemporaryOverlayInstance val = TemporaryOverlayManager.AddOverlay(((Component)self.modelTransform).gameObject); val.duration = 0.6f; val.animateShaderAlpha = true; val.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f); val.destroyComponentOnEnd = true; val.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matHuntressFlashBright"); val.inspectorCharacterModel = component; TemporaryOverlayInstance val2 = TemporaryOverlayManager.AddOverlay(((Component)self.modelTransform).gameObject); val2.duration = 0.7f; val2.animateShaderAlpha = true; val2.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f); val2.destroyComponentOnEnd = true; val2.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matHuntressFlashExpanded"); val2.inspectorCharacterModel = component; } } bool flag = self.stopwatch >= EvisDash.dashDuration + EvisDash.dashPrepDuration; if (self.isDashing) { if (Object.op_Implicit((Object)(object)((EntityState)self).characterMotor) && Object.op_Implicit((Object)(object)((EntityState)self).characterDirection)) { CharacterMotor characterMotor = ((EntityState)self).characterMotor; characterMotor.rootMotion += self.dashVector * (((BaseState)self).moveSpeedStat * EvisDash.speedCoefficient * Time.fixedDeltaTime); } if (((EntityState)self).isAuthority) { Collider[] array = Physics.OverlapSphere(((EntityState)self).transform.position, ((EntityState)self).characterBody.radius + EvisDash.overlapSphereRadius * (flag ? EvisDash.lollypopFactor : 1f), LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.entityPrecise)).mask)); for (int i = 0; i < array.Length; i++) { HurtBox component2 = ((Component)array[i]).GetComponent<HurtBox>(); if (Object.op_Implicit((Object)(object)component2) && component2.teamIndex != ((EntityState)self).teamComponent.teamIndex) { Evis nextState = new Evis(); ((EntityState)self).outer.SetNextState((EntityState)(object)nextState); return; } } } } if (flag && ((EntityState)self).isAuthority) { ((EntityState)self).outer.SetNextStateToMain(); } } else { orig.Invoke(self); } } private void EvisDash_OnEnter(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0044: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 2) })) { val.Remove(); val.Emit(OpCodes.Ldc_I4, 3); } else { Main.HMTLogger.LogError((object)"Failed to apply Eviscerate Camera hook"); } } private void Evis_OnEnter1(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0044: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 2) })) { val.Remove(); val.Emit(OpCodes.Ldc_I4, 3); } else { Main.HMTLogger.LogError((object)"Failed to apply Eviscerate Camera hook"); } } private void Evis_FixedUpdate(orig_FixedUpdate orig, Evis self) { //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: 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_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Expected O, but got Unknown //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Unknown result type (might be due to invalid IL or missing references) if (allowMovement) { self.stopwatch += Time.fixedDeltaTime; self.attackStopwatch += Time.fixedDeltaTime; float num = 1f / Evis.damageFrequency / ((BaseState)self).attackSpeedStat; if (self.attackStopwatch >= num) { self.attackStopwatch -= num; HurtBox val = self.SearchForTarget(); if (Object.op_Implicit((Object)(object)val)) { Util.PlayAttackSpeedSound(Evis.slashSoundString, ((EntityState)self).gameObject, Evis.slashPitch); Util.PlaySound(Evis.dashSoundString, ((EntityState)self).gameObject); Util.PlaySound(Evis.impactSoundString, ((EntityState)self).gameObject); HurtBoxGroup hurtBoxGroup = val.hurtBoxGroup; HurtBox val2 = hurtBoxGroup.hurtBoxes[0]; if (Object.op_Implicit((Object)(object)val2)) { Vector3 position = ((Component)val2).transform.position; Vector2 insideUnitCircle = Random.insideUnitCircle; Vector2 normalized = ((Vector2)(ref insideUnitCircle)).normalized; Vector3 val3 = default(Vector3); ((Vector3)(ref val3))..ctor(normalized.x, 0f, normalized.y); EffectManager.SimpleImpactEffect(Evis.hitEffectPrefab, position, val3, false); Transform transform = ((Component)val.hurtBoxGroup).transform; TemporaryOverlayInstance val4 = TemporaryOverlayManager.AddOverlay(((Component)self.modelTransform).gameObject); val4.duration = num; val4.animateShaderAlpha = true; val4.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f); val4.destroyComponentOnEnd = true; val4.originalMaterial = LegacyResourcesAPI.Load<Material>("Materials/matMercEvisTarget"); val4.inspectorCharacterModel = ((Component)((EntityState)self).transform).GetComponent<CharacterModel>(); if (NetworkServer.active) { DamageInfo val5 = new DamageInfo(); val5.damage = Evis.damageCoefficient * ((BaseState)self).damageStat; val5.attacker = ((EntityState)self).gameObject; val5.procCoefficient = Evis.procCoefficient; val5.position = ((Component)val2).transform.position; val5.crit = self.crit; val2.healthComponent.TakeDamage(val5); GlobalEventManager.instance.OnHitEnemy(val5, ((Component)val2.healthComponent).gameObject); GlobalEventManager.instance.OnHitAll(val5, ((Component)val2.healthComponent).gameObject); } } } else if (((EntityState)self).isAuthority && self.stopwatch > Evis.minimumDuration) { ((EntityState)self).outer.SetNextStateToMain(); } } if (self.stopwatch >= Evis.duration && ((EntityState)self).isAuthority) { ((EntityState)self).outer.SetNextStateToMain(); } } else { orig.Invoke(self); } } private HurtBox Evis_SearchForTarget(orig_SearchForTarget orig, Evis self) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: 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_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_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown if (ignoreAllies) { BullseyeSearch val = new BullseyeSearch { searchOrigin = ((EntityState)self).transform.position, searchDirection = ((EntityState)self).inputBank.aimDirection, maxDistanceFilter = Evis.maxRadius, teamMaskFilter = TeamMask.AllExcept(((BaseState)self).GetTeam()), sortMode = (SortMode)2 }; val.RefreshCandidates(); val.FilterOutGameObject(((EntityState)self).gameObject); return val.GetResults().FirstOrDefault(); } return orig.Invoke(self); } private void Evis_OnEnter(orig_OnEnter orig, Evis self) { Evis.damageCoefficient = damageCoefficient; 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) SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Merc/MercBodyEvis.asset").WaitForCompletion(); val.baseRechargeInterval = cooldown; } } internal class FocusedAssault : TweakBase<FocusedAssault> { public static bool scaleDurationWithAttackSpeed; public override string Name => "Utility :: Focused Assault"; public override string SkillToken => "utility_alt1"; public override string DescText => (Main.scaleSomeSkillDamageWithAttackSpeed.Value ? "<style=cIsDamage>Fleeting</style>. " : "") + "<style=cIsDamage>Stunning</style>. Dash forward, dealing <style=cIsDamage>700% damage</style> and <style=cIsUtility>Exposing</style> enemies after <style=cIsUtility>1 second</style>."; public override void Init() { scaleDurationWithAttackSpeed = ConfigOption(value: false, "Scale animation speed with Attack 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_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 FocusedAssaultPrep.OnEnter += new hook_OnEnter(FocusedAssaultPrep_OnEnter); FocusedAssaultDash.AuthorityModifyOverlapAttack += new hook_AuthorityModifyOverlapAttack(FocusedAssaultDash_AuthorityModifyOverlapAttack); FocusedAssaultDash.OnEnter += new hook_OnEnter(FocusedAssaultDash_OnEnter); Changes(); } private void FocusedAssaultDash_AuthorityModifyOverlapAttack(orig_AuthorityModifyOverlapAttack orig, FocusedAssaultDash self, OverlapAttack overlapAttack) { if (Main.scaleSomeSkillDamageWithAttackSpeed.Value && ((EntityState)self).isAuthority) { float delayedDamageCoefficient = 7f + 7f * ((((BaseState)self).attackSpeedStat - 1f) * 0.4285714f); self.delayedDamageCoefficient = delayedDamageCoefficient; } orig.Invoke(self, overlapAttack); } private void FocusedAssaultDash_OnEnter(orig_OnEnter orig, FocusedAssaultDash self) { orig.Invoke(self); if (!scaleDurationWithAttackSpeed) { ((BasicMeleeAttack)self).duration = ((BasicMeleeAttack)self).baseDuration; } } private void FocusedAssaultPrep_OnEnter(orig_OnEnter orig, FocusedAssaultPrep self) { orig.Invoke(self); if (!scaleDurationWithAttackSpeed) { self.duration = self.baseDuration; } } private void Changes() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) if (Main.scaleSomeSkillDamageWithAttackSpeed.Value) { string[] keywordTokens = new string[3] { "KEYWORD_FLEETING", "KEYWORD_STUNNING", "KEYWORD_EXPOSE" }; SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Merc/MercBodyFocusedAssault.asset").WaitForCompletion(); val.keywordTokens = keywordTokens; } } } internal class LaserSword : TweakBase<LaserSword> { public static bool scaleDurationWithAttackSpeed; public override string Name => "Primary : Laser Sword"; public override string SkillToken => "primary"; public override string DescText => (Main.scaleSomeSkillDamageWithAttackSpeed.Value ? "<style=cIsDamage>Fleeting</style>. " : "") + "<style=cIsUtility>Agile</style>. Slice in front for <style=cIsDamage>130% damage</style>. Every 3rd hit strikes in a greater area and <style=cIsUtility>Exposes</style> enemies."; public override void Init() { scaleDurationWithAttackSpeed = ConfigOption(value: false, "Scale animation speed with Attack 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 GroundLight2.OnEnter += new hook_OnEnter(GroundLight2_OnEnter); Changes(); } private void GroundLight2_OnEnter(orig_OnEnter orig, GroundLight2 self) { orig.Invoke(self); if (!scaleDurationWithAttackSpeed) { ((BasicMeleeAttack)self).duration = ((BasicMeleeAttack)self).baseDuration; self.durationBeforeInterruptable = (self.isComboFinisher ? GroundLight2.comboFinisherBaseDurationBeforeInterruptable : GroundLight2.baseDurationBeforeInterruptable); ((BasicMeleeAttack)self).ignoreAttackSpeed = true; ((BasicMeleeAttack)self).scaleHitPauseDurationAndVelocityWithAttackSpeed = false; } if (Main.scaleSomeSkillDamageWithAttackSpeed.Value && ((EntityState)self).isAuthority) { float damage = ((BasicMeleeAttack)self).overlapAttack.damage + ((BasicMeleeAttack)self).overlapAttack.damage * ((((BaseState)self).attackSpeedStat - 1f) * (((BasicMeleeAttack)self).overlapAttack.damage / 100f)); ((BasicMeleeAttack)self).overlapAttack.damage = damage; } } 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/Merc/MercGroundLight2.asset").WaitForCompletion(); List<string> list = new List<string>(); if (Main.scaleSomeSkillDamageWithAttackSpeed.Value) { list.Add("KEYWORD_FLEETING"); } list.Add("KEYWORD_AGILE"); list.Add("KEYWORD_EXPOSE"); val.keywordTokens = list.ToArray(); } } internal class RisingThunder : TweakBase<RisingThunder> { public static bool scaleDurationWithAttackSpeed; public static float upwardForce; public static float damageCoefficient; public static float duration; public static bool agile; public override string Name => "Secondary :: Rising Thunder"; public override string SkillToken => "secondary_alt1"; public override string DescText => (Main.scaleSomeSkillDamageWithAttackSpeed.Value ? "<style=cIsDamage>Fleeting</style>. " : "") + (agile ? "<style=cIsUtility>Agile</style>. " : "") + "Unleash a slicing uppercut, dealing <style=cIsDamage>" + d(damageCoefficient) + " damage</style> and sending you airborne."; public override void Init() { scaleDurationWithAttackSpeed = ConfigOption(value: false, "Scale animation speed with Attack Speed?", "Vanilla is true"); upwardForce = ConfigOption(2000f, "Upward Boost Strength", "Vanilla is 3000"); damageCoefficient = ConfigOption(6f, "Damage", "Decimal. Vanilla is 5.5"); duration = ConfigOption(0.25f, "Base Duration", "Vanilla is 0.4"); agile = ConfigOption(value: true, "Agile?", "Vanilla is false"); 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 Uppercut.OnEnter += new hook_OnEnter(Uppercut_OnEnter); Uppercut.PlayAnim += new hook_PlayAnim(Uppercut_PlayAnim); Changes(); } private void Uppercut_PlayAnim(orig_PlayAnim orig, Uppercut self) { Uppercut.baseDuration = duration; if (!scaleDurationWithAttackSpeed) { self.duration = Uppercut.baseDuration; } orig.Invoke(self); } private void Uppercut_OnEnter(orig_OnEnter orig, Uppercut self) { Uppercut.upwardForceStrength = upwardForce; Uppercut.baseDamageCoefficient = damageCoefficient; orig.Invoke(self); if (Main.scaleSomeSkillDamageWithAttackSpeed.Value && ((EntityState)self).isAuthority) { float damage = self.overlapAttack.damage + self.overlapAttack.damage * ((((BaseState)self).attackSpeedStat - 1f) * (self.overlapAttack.damage / 432f)); self.overlapAttack.damage = damage; } } private void Changes() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) List<string> list = new List<string>(); SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Merc/MercBodyUppercut.asset").WaitForCompletion(); if (Main.scaleSomeSkillDamageWithAttackSpeed.Value) { list.Add("KEYWORD_FLEETING"); } if (agile) { list.Add("KEYWORD_AGILE"); val.cancelSprintingOnActivation = false; } val.keywordTokens = list.ToArray(); } } public class SlicingWinds : TweakBase<SlicingWinds> { public static float damage; public static bool agile; public static float scaleMultiplier; public override string Name => "Special :: Slicing Winds"; public override string SkillToken => "special_alt1"; public override string DescText => (agile ? "<style=cIsUtility>Agile</style>. " : "") + "Fire a wind of blades that attack up to <style=cIsDamage>3</style> enemies for <style=cIsDamage>8x" + d(damage) + " damage</style>. The last hit <style=cIsUtility>Exposes</style> enemies."; public override void Init() { damage = ConfigOption(1f, "Damage", "Decimal. Vanilla is 1"); agile = ConfigOption(value: true, "Agile?", "Vanilla is false"); scaleMultiplier = ConfigOption(2.5f, "Projectile Scale Multiplier", "Makes the projectile easier to hit (as a result, it can get stuck on terrain easier). 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 ThrowEvisProjectile.OnEnter += new hook_OnEnter(ThrowEvisProjectile_OnEnter); Changes(); } private void ThrowEvisProjectile_OnEnter(orig_OnEnter orig, ThrowEvisProjectile self) { ((GenericProjectileBaseState)self).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_001a: 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_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Merc/EvisProjectile.prefab").WaitForCompletion(); val.transform.localScale = Vector3.one * scaleMultiplier; SkillDef val2 = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Merc/MercBodyEvisProjectile.asset").WaitForCompletion(); List<string> list = new List<string>(); if (agile) { val2.cancelSprintingOnActivation = false; list.Add("KEYWORD_AGILE"); } list.Add("KEYWORD_EXPOSE"); val2.keywordTokens = list.ToArray(); } } internal class Whirlwind : TweakBase<Whirlwind> { public static bool scaleDurationWithAttackSpeed; public static bool agile; public static float groundedSpeedCoefficient; public static float airborneSpeedCoefficient; public override string Name => "Secondary : Whirlwind"; public override string SkillToken => "secondary"; public override string DescText => (Main.scaleSomeSkillDamageWithAttackSpeed.Value ? "<style=cIsDamage>Fleeting</style>. " : "") + (agile ? "<style=cIsUtility>Agile</style>. " : "") + "Quickly slice horizontally twice, dealing <style=cIsDamage>2x200% damage</style>. If airborne, slice vertically instead."; public override void Init() { scaleDurationWithAttackSpeed = ConfigOption(value: false, "Scale animation speed with Attack Speed?", "Vanilla is true"); agile = ConfigOption(value: true, "Agile?", "Vanilla is false"); groundedSpeedCoefficient = ConfigOption(6f, "Grounded Speed Coefficient", "Vanilla is 8. This is a compensation for it being Agile and going farther than usual with the default value."); airborneSpeedCoefficient = ConfigOption(3f, "Airborne Speed Coefficient", "Vanilla is 3."); 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 WhirlwindBase.OnEnter += new hook_OnEnter(WhirlwindBase_OnEnter); WhirlwindAir.PlayAnim += new hook_PlayAnim(WhirlwindAir_PlayAnim); WhirlwindGround.PlayAnim += new hook_PlayAnim(WhirlwindGround_PlayAnim); Changes(); } private void WhirlwindGround_PlayAnim(orig_PlayAnim orig, WhirlwindGround self) { ((WhirlwindBase)self).moveSpeedBonusCoefficient = groundedSpeedCoefficient; if (!scaleDurationWithAttackSpeed) { ((WhirlwindBase)self).duration = ((WhirlwindBase)self).baseDuration; } orig.Invoke(self); } private void WhirlwindAir_PlayAnim(orig_PlayAnim orig, WhirlwindAir self) { ((WhirlwindBase)self).moveSpeedBonusCoefficient = airborneSpeedCoefficient; if (!scaleDurationWithAttackSpeed) { ((WhirlwindBase)self).duration = ((WhirlwindBase)self).baseDuration; } orig.Invoke(self); } private void WhirlwindBase_OnEnter(orig_OnEnter orig, WhirlwindBase self) { orig.Invoke(self); if (!scaleDurationWithAttackSpeed) { self.duration = self.baseDuration; self.hitPauseTimer = WhirlwindBase.hitPauseDuration; } if (Main.scaleSomeSkillDamageWithAttackSpeed.Value && ((EntityState)self).isAuthority) { float damage = self.overlapAttack.damage + self.overlapAttack.damage * ((((BaseState)self).attackSpeedStat - 1f) * (self.overlapAttack.damage / 100f)); self.overlapAttack.damage = damage; } } private void Changes() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) List<string> list = new List<string>(); SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Merc/MercBodyWhirlwind.asset").WaitForCompletion(); if (Main.scaleSomeSkillDamageWithAttackSpeed.Value) { list.Add("KEYWORD_FLEETING"); } if (agile) { val.cancelSprintingOnActivation = false; list.Add("KEYWORD_AGILE"); } val.keywordTokens = list.ToArray(); } private void StartingTheCollapseWhirlwind() { } } }