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 HIFUMercenaryTweaks v1.1.2
HIFUMercenaryTweaks.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using EntityStates.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() { } } }