using System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using EntityStates; using EntityStates.Merc; using EntityStates.Merc.Weapon; using Microsoft.CodeAnalysis; using On.EntityStates.Merc; using On.EntityStates.Merc.Weapon; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using RoR2.Skills; using UnityEngine; using UnityEngine.AddressableAssets; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("MercExtraEffects")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+b7b2c9c3b69d1c7d9c8bb5e35fb3fb1d84483aaf")] [assembly: AssemblyProduct("MercExtraEffects")] [assembly: AssemblyTitle("MercExtraEffects")] [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 ExamplePlugin { public sealed class ConfigValue { public ConfigEntry Entry; public readonly T DefaultValue; public readonly T MinValue; public readonly T MaxValue; public readonly T IncrementValue; public T Value => Entry.Value; public ConfigValue(T defaultValue) { DefaultValue = defaultValue; MinValue = default(T); MaxValue = default(T); IncrementValue = default(T); } public ConfigValue(T defaultValue, T minValue, T maxValue, T incrementValue) { DefaultValue = defaultValue; MinValue = minValue; MaxValue = maxValue; IncrementValue = incrementValue; } public string DefaultAsString() { return $"Default: {DefaultValue}"; } } [BepInPlugin("com.fafnir62.mercenary_extra_effects", "Mercenary Extra Effects", "1.3.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class MercExtraEffectsPlugin : BaseUnityPlugin { private class MercTracker : MonoBehaviour { public bool uppercutActive; public bool whirlwindActive; } public const string PluginGUID = "com.fafnir62.mercenary_extra_effects"; public const string PluginName = "Mercenary Extra Effects"; public const string PluginVersion = "1.3.2"; private static BodyIndex mercBodyIndex = (BodyIndex)(-1); private static ConfigValue cfgSecondaryLifestealPercent = new ConfigValue(15f, 0f, 200f, 1f); private static ConfigValue cfgEvisBarrierPercent = new ConfigValue(15f, 0f, 40f, 1f); private static ConfigValue cfgFocusedAssaultDamagePercent = new ConfigValue(700f, 350f, 1400f, 10f); private static ConfigValue cfgFocusedAssaultCooldownSeconds = new ConfigValue(8f, 4f, 16f, 1f); private static ConfigValue cfgEvisDamagePercent = new ConfigValue(110f, 50f, 220f, 10f); private static ConfigValue cfgEvisCooldownSeconds = new ConfigValue(6f, 3f, 16f, 1f); private static ConfigValue cfgBlindingAssaultDamagePercent = new ConfigValue(300f, 150f, 600f, 10f); private static ConfigValue cfgBlindingAssaultCooldownSeconds = new ConfigValue(5f, 3f, 16f, 1f); private const float UtilityCooldownSeconds = 6f; private const string FocusedAssaultSkillDefPath = "RoR2/Base/Merc/MercBodyFocusedAssault.asset"; private const string BlindingAssaultSkillDefPath = "RoR2/Base/Merc/MercBodyAssaulter.asset"; private static readonly string[] EvisSkillDefPaths = new string[3] { "RoR2/Base/Merc/MercBodyEviscerate.asset", "RoR2/Base/Merc/MercBodyEvis.asset", "RoR2/Base/Merc/MercBodySpecialEviscerate.asset" }; public static ConfigValue M1AttackSpeedFix { get; set; } = new ConfigValue(defaultValue: true); public static ConfigValue M2AttackSpeedIgnore { get; set; } = new ConfigValue(defaultValue: true); public static ConfigValue EvisIgnoreAllies { get; set; } = new ConfigValue(defaultValue: true); private void Awake() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[MercExtraEffects] Awake"); InitConfig(); RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(OnGameLoaded)); } private void OnGameLoaded() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Expected O, but got Unknown //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Expected O, but got Unknown //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Expected O, but got Unknown //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Expected O, but got Unknown //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Expected O, but got Unknown //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Expected O, but got Unknown //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Expected O, but got Unknown //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Expected O, but got Unknown //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Expected O, but got Unknown mercBodyIndex = BodyCatalog.FindBodyIndex("MercBody"); ((BaseUnityPlugin)this).Logger.LogInfo((object)("[MercExtraEffects] MercBodyIndex=" + ((object)(BodyIndex)(ref mercBodyIndex)).ToString())); CharacterBody.onBodyStartGlobal += OnBodyStart; Uppercut.OnEnter += new hook_OnEnter(Uppercut_OnEnter); Uppercut.OnExit += new hook_OnExit(Uppercut_OnExit); WhirlwindBase.OnEnter += new hook_OnEnter(WhirlwindBase_OnEnter); WhirlwindBase.OnExit += new hook_OnExit(WhirlwindBase_OnExit); EvisDash.FixedUpdate += new hook_FixedUpdate(Evis_FixedUpdate); GroundLight2.OnEnter += new hook_OnEnter(M1_onEnter); Uppercut.PlayAnim += new hook_PlayAnim(Uppercut_PlayAnim); WhirlwindAir.PlayAnim += new hook_PlayAnim(WhirlwindAir_PlayAnim); WhirlwindGround.PlayAnim += new hook_PlayAnim(WhirlwindGround_PlayAnim); Evis.OnExit += new hook_OnExit(Evis_OnExit); FocusedAssaultDash.AuthorityModifyOverlapAttack += new hook_AuthorityModifyOverlapAttack(FocusedAssaultDash_AuthorityModifyOverlapAttack); Assaulter2.AuthorityModifyOverlapAttack += new hook_AuthorityModifyOverlapAttack(Assaulter2_AuthorityModifyOverlapAttack); GlobalEventManager.onServerDamageDealt += OnServerDamageDealt; ApplySkillTuning(); } private static Sprite LoadEmbeddedSprite(string resourceName) { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) using Stream stream = typeof(MercExtraEffectsPlugin).Assembly.GetManifestResourceStream(resourceName); if (stream == null) { Debug.LogError((object)("Failed to load resource: " + resourceName)); return null; } byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); Texture2D val = new Texture2D(2, 2); ImageConversion.LoadImage(val, array); return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f)); } private void InitConfig() { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Expected O, but got Unknown //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Expected O, but got Unknown //IL_0228: Unknown result type (might be due to invalid IL or missing references) //IL_0232: Expected O, but got Unknown //IL_0288: Unknown result type (might be due to invalid IL or missing references) //IL_0292: Expected O, but got Unknown //IL_02e8: Unknown result type (might be due to invalid IL or missing references) //IL_02f2: Expected O, but got Unknown //IL_0348: Unknown result type (might be due to invalid IL or missing references) //IL_0352: Expected O, but got Unknown //IL_03a8: Unknown result type (might be due to invalid IL or missing references) //IL_03b2: Expected O, but got Unknown //IL_0407: Unknown result type (might be due to invalid IL or missing references) //IL_0411: Expected O, but got Unknown //IL_041b: Unknown result type (might be due to invalid IL or missing references) //IL_0425: Expected O, but got Unknown //IL_042f: Unknown result type (might be due to invalid IL or missing references) //IL_0439: Expected O, but got Unknown cfgSecondaryLifestealPercent.Entry = ((BaseUnityPlugin)this).Config.Bind("Skills effects", "Secondary Lifesteal (%)", cfgSecondaryLifestealPercent.DefaultValue, new ConfigDescription("How much of damage dealt is healed while Merc M2 (Uppercut/Whirlwind) is active. " + cfgSecondaryLifestealPercent.DefaultAsString(), (AcceptableValueBase)(object)new AcceptableValueRange(cfgSecondaryLifestealPercent.MinValue, cfgSecondaryLifestealPercent.MaxValue), Array.Empty())); cfgEvisBarrierPercent.Entry = ((BaseUnityPlugin)this).Config.Bind("Skills effects", "Evis Barrier HP (%)", cfgEvisBarrierPercent.DefaultValue, new ConfigDescription("Barrier gained after Eviscerate as % of max mercenary health. " + cfgEvisBarrierPercent.DefaultAsString(), (AcceptableValueBase)(object)new AcceptableValueRange(cfgEvisBarrierPercent.MinValue, cfgEvisBarrierPercent.MaxValue), Array.Empty())); M1AttackSpeedFix.Entry = ((BaseUnityPlugin)this).Config.Bind("Skills effects", "M1 attack speed fix", M1AttackSpeedFix.DefaultValue, "When enabled, gives Merc's 3rd m1 a fixed duration, allowing for consistent m1 extends. " + M1AttackSpeedFix.DefaultAsString()); M2AttackSpeedIgnore.Entry = ((BaseUnityPlugin)this).Config.Bind("Skills effects", "M2 Attack Speed Ignore", M2AttackSpeedIgnore.DefaultValue, "When enabled, Whirlwind and Rising Thunder ignore attack speed, making their utility consistent throughout the run. " + M2AttackSpeedIgnore.DefaultAsString()); EvisIgnoreAllies.Entry = ((BaseUnityPlugin)this).Config.Bind("Skills effects", "Eviscerate ignore allies", EvisIgnoreAllies.DefaultValue, "When enabled, Eviscerate will not target drones and other allies. " + EvisIgnoreAllies.DefaultAsString()); cfgFocusedAssaultDamagePercent.Entry = ((BaseUnityPlugin)this).Config.Bind("Damage and cooldown", "Focused Assault Damage (%)", cfgFocusedAssaultDamagePercent.DefaultValue, new ConfigDescription("Focused Assault damage per dash hit (vanilla 700%). " + cfgFocusedAssaultDamagePercent.DefaultAsString(), (AcceptableValueBase)(object)new AcceptableValueRange(cfgFocusedAssaultDamagePercent.MinValue, cfgFocusedAssaultDamagePercent.MaxValue), Array.Empty())); cfgFocusedAssaultCooldownSeconds.Entry = ((BaseUnityPlugin)this).Config.Bind("Damage and cooldown", "Focused Assault Cooldown (s)", cfgFocusedAssaultCooldownSeconds.DefaultValue, new ConfigDescription("Focused Assault base cooldown in seconds (vanilla 8). " + cfgFocusedAssaultCooldownSeconds.DefaultAsString(), (AcceptableValueBase)(object)new AcceptableValueRange(cfgFocusedAssaultCooldownSeconds.MinValue, cfgFocusedAssaultCooldownSeconds.MaxValue), Array.Empty())); cfgEvisDamagePercent.Entry = ((BaseUnityPlugin)this).Config.Bind("Damage and cooldown", "Eviscerate Damage (%)", cfgEvisDamagePercent.DefaultValue, new ConfigDescription("Eviscerate damage per hit (vanilla 110%). Example: 110 = 110%. " + cfgEvisDamagePercent.DefaultAsString(), (AcceptableValueBase)(object)new AcceptableValueRange(cfgEvisDamagePercent.MinValue, cfgEvisDamagePercent.MaxValue), Array.Empty())); cfgEvisCooldownSeconds.Entry = ((BaseUnityPlugin)this).Config.Bind("Damage and cooldown", "Eviscerate Cooldown (s)", cfgEvisCooldownSeconds.DefaultValue, new ConfigDescription("Eviscerate base cooldown in seconds (vanilla 6). " + cfgEvisCooldownSeconds.DefaultAsString(), (AcceptableValueBase)(object)new AcceptableValueRange(cfgEvisCooldownSeconds.MinValue, cfgEvisCooldownSeconds.MaxValue), Array.Empty())); cfgBlindingAssaultDamagePercent.Entry = ((BaseUnityPlugin)this).Config.Bind("Damage and cooldown", "Blinding Assault Damage (%)", cfgBlindingAssaultDamagePercent.DefaultValue, new ConfigDescription("Blinding Assault damage per dash hit (vanilla 300%). Example: 300 = 300%. " + cfgBlindingAssaultDamagePercent.DefaultAsString(), (AcceptableValueBase)(object)new AcceptableValueRange(cfgBlindingAssaultDamagePercent.MinValue, cfgBlindingAssaultDamagePercent.MaxValue), Array.Empty())); cfgBlindingAssaultCooldownSeconds.Entry = ((BaseUnityPlugin)this).Config.Bind("Damage and cooldown", "Blinding Assault Cooldown (s)", cfgBlindingAssaultCooldownSeconds.DefaultValue, new ConfigDescription("Blinding Assault base cooldown in seconds (vanilla 8). " + cfgBlindingAssaultCooldownSeconds.DefaultAsString(), (AcceptableValueBase)(object)new AcceptableValueRange(cfgBlindingAssaultCooldownSeconds.MinValue, cfgBlindingAssaultCooldownSeconds.MaxValue), Array.Empty())); ((BaseUnityPlugin)this).Config.SettingChanged += OnAnyConfigSettingChanged; try { ModSettingsManager.SetModDescription("Mercenary skill effects.\n\nThis mod is configured via the BepInEx config file and RiskUI."); ModSettingsManager.SetModIcon(LoadEmbeddedSprite("ExamplePlugin.Assets.MercExtraEffectIcon128.png")); AddConfigSlider(cfgSecondaryLifestealPercent); AddConfigSlider(cfgEvisBarrierPercent); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(M1AttackSpeedFix.Entry)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(M2AttackSpeedIgnore.Entry)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(EvisIgnoreAllies.Entry)); AddConfigSlider(cfgFocusedAssaultDamagePercent); AddConfigSlider(cfgFocusedAssaultCooldownSeconds); AddConfigSlider(cfgEvisDamagePercent); AddConfigSlider(cfgEvisCooldownSeconds); AddConfigSlider(cfgBlindingAssaultDamagePercent); AddConfigSlider(cfgBlindingAssaultCooldownSeconds); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogInfo((object)("[MercExtraEffects] RiskOfOptions UI not available: " + ex.Message)); } } private void AddConfigSlider(ConfigValue entry) { //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_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown ModSettingsManager.AddOption((BaseOption)new StepSliderOption(entry.Entry, new StepSliderConfig { min = entry.MinValue, max = entry.MaxValue, increment = entry.IncrementValue })); } private void OnAnyConfigSettingChanged(object sender, SettingChangedEventArgs e) { if (e == null || e.ChangedSetting == null) { return; } try { if (e.ChangedSetting == cfgSecondaryLifestealPercent.Entry || e.ChangedSetting == cfgEvisBarrierPercent.Entry || e.ChangedSetting == cfgFocusedAssaultDamagePercent.Entry || e.ChangedSetting == cfgFocusedAssaultCooldownSeconds.Entry || e.ChangedSetting == cfgEvisDamagePercent.Entry || e.ChangedSetting == cfgEvisCooldownSeconds.Entry || e.ChangedSetting == cfgBlindingAssaultDamagePercent.Entry || e.ChangedSetting == cfgBlindingAssaultCooldownSeconds.Entry || e.ChangedSetting == M1AttackSpeedFix.Entry || e.ChangedSetting == M2AttackSpeedIgnore.Entry || e.ChangedSetting == EvisIgnoreAllies.Entry) { ApplySkillTuning(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[MercExtraEffects] In-game config change detected"); } } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("[MercExtraEffects] Failed config update: " + ex)); } } private static bool IsMerc(CharacterBody body) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)body != (Object)null) { return body.bodyIndex == mercBodyIndex; } return false; } private void OnBodyStart(CharacterBody body) { if (!((Object)(object)body == (Object)null) && (Object)(object)((Component)body).GetComponent() == (Object)null) { ((Component)body).gameObject.AddComponent(); } } private static MercTracker GetTracker(CharacterBody body) { if (!((Object)(object)body != (Object)null)) { return null; } return ((Component)body).GetComponent(); } private void Uppercut_OnEnter(orig_OnEnter orig, Uppercut self) { orig.Invoke(self); CharacterBody characterBody = ((EntityState)self).characterBody; if (IsMerc(characterBody)) { MercTracker tracker = GetTracker(characterBody); if ((Object)(object)tracker != (Object)null) { tracker.uppercutActive = true; } } } private void Uppercut_OnExit(orig_OnExit orig, Uppercut self) { CharacterBody characterBody = ((EntityState)self).characterBody; if (IsMerc(characterBody)) { MercTracker tracker = GetTracker(characterBody); if ((Object)(object)tracker != (Object)null) { tracker.uppercutActive = false; } } orig.Invoke(self); } private void WhirlwindBase_OnEnter(orig_OnEnter orig, WhirlwindBase self) { orig.Invoke(self); CharacterBody characterBody = ((EntityState)self).characterBody; if (IsMerc(characterBody)) { MercTracker tracker = GetTracker(characterBody); if ((Object)(object)tracker != (Object)null) { tracker.whirlwindActive = true; } } } private void WhirlwindBase_OnExit(orig_OnExit orig, WhirlwindBase self) { CharacterBody characterBody = ((EntityState)self).characterBody; if (IsMerc(characterBody)) { MercTracker tracker = GetTracker(characterBody); if ((Object)(object)tracker != (Object)null) { tracker.whirlwindActive = false; } } orig.Invoke(self); } private void Evis_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_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: 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_020a: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_025c: Expected O, but got Unknown if (!EvisIgnoreAllies.Value) { orig.Invoke(self); return; } 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)) { TemporaryOverlay obj = ((Component)self.modelTransform).gameObject.AddComponent(); obj.duration = 0.6f; obj.animateShaderAlpha = true; obj.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f); obj.destroyComponentOnEnd = true; obj.originalMaterial = Resources.Load("Materials/matHuntressFlashBright"); obj.AddToCharacerModel(((Component)self.modelTransform).GetComponent()); TemporaryOverlay obj2 = ((Component)self.modelTransform).gameObject.AddComponent(); obj2.duration = 0.7f; obj2.animateShaderAlpha = true; obj2.alphaCurve = AnimationCurve.EaseInOut(0f, 1f, 1f, 0f); obj2.destroyComponentOnEnd = true; obj2.originalMaterial = Resources.Load("Materials/matHuntressFlashExpanded"); obj2.AddToCharacerModel(((Component)self.modelTransform).GetComponent()); } } 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 component = ((Component)array[i]).GetComponent(); if (Object.op_Implicit((Object)(object)component) && (Object)(object)component.healthComponent != (Object)(object)((EntityState)self).healthComponent && component.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(); } } private void M1_onEnter(orig_OnEnter orig, GroundLight2 self) { if (M1AttackSpeedFix.Value) { if (self.step == 2) { ((BasicMeleeAttack)self).ignoreAttackSpeed = true; } orig.Invoke(self); if (((BasicMeleeAttack)self).ignoreAttackSpeed && self.isComboFinisher) { self.durationBeforeInterruptable = GroundLight2.comboFinisherBaseDurationBeforeInterruptable; } } else { orig.Invoke(self); } } private void Uppercut_PlayAnim(orig_PlayAnim orig, Uppercut self) { if (M2AttackSpeedIgnore.Value) { self.duration = Uppercut.baseDuration; } orig.Invoke(self); } private void WhirlwindAir_PlayAnim(orig_PlayAnim orig, WhirlwindAir self) { if (M2AttackSpeedIgnore.Value) { ((WhirlwindBase)self).duration = ((WhirlwindBase)self).baseDuration; } orig.Invoke(self); } private void WhirlwindGround_PlayAnim(orig_PlayAnim orig, WhirlwindGround self) { if (M2AttackSpeedIgnore.Value) { ((WhirlwindBase)self).duration = ((WhirlwindBase)self).baseDuration; } orig.Invoke(self); } private void Evis_OnExit(orig_OnExit orig, Evis self) { CharacterBody characterBody = ((EntityState)self).characterBody; if (IsMerc(characterBody)) { HealthComponent healthComponent = characterBody.healthComponent; if (Object.op_Implicit((Object)(object)healthComponent)) { float num = Mathf.Clamp(cfgEvisBarrierPercent.Value, 0f, 100f) / 100f; float num2 = healthComponent.fullCombinedHealth * num; if (num2 > 0f) { healthComponent.AddBarrier(num2); } } } orig.Invoke(self); } private void FocusedAssaultDash_AuthorityModifyOverlapAttack(orig_AuthorityModifyOverlapAttack orig, FocusedAssaultDash self, OverlapAttack overlapAttack) { orig.Invoke(self, overlapAttack); try { if (self != null && overlapAttack != null) { float num = Mathf.Clamp(cfgFocusedAssaultDamagePercent.Value, 0f, 5000f) / 100f; overlapAttack.damage = ((BaseState)self).damageStat * num; } } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("[MercExtraEffects] FocusedAssaultDash_AuthorityModifyOverlapAttack error: " + ex)); } } private void Assaulter2_AuthorityModifyOverlapAttack(orig_AuthorityModifyOverlapAttack orig, Assaulter2 self, OverlapAttack attack) { orig.Invoke(self, attack); try { if (self != null && attack != null) { float num = Mathf.Clamp(cfgBlindingAssaultDamagePercent.Value, 0f, 5000f) / 100f; attack.damage = ((BaseState)self).damageStat * num; } } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("[MercExtraEffects] Assaulter2_AuthorityModifyOverlapAttack error: " + ex)); } } private void OnServerDamageDealt(DamageReport report) { //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) try { if (report == null) { return; } CharacterBody attackerBody = report.attackerBody; if (!IsMerc(attackerBody)) { return; } MercTracker tracker = GetTracker(attackerBody); if ((Object)(object)tracker == (Object)null) { return; } HealthComponent healthComponent = attackerBody.healthComponent; if (!Object.op_Implicit((Object)(object)healthComponent)) { return; } float damageDealt = report.damageDealt; if (!(damageDealt <= 0f) && (tracker.uppercutActive || tracker.whirlwindActive)) { float num = Mathf.Clamp(cfgSecondaryLifestealPercent.Value, 0f, 200f) / 100f; float num2 = damageDealt * num; if (num2 > 0f) { healthComponent.Heal(num2, default(ProcChainMask), true); } } } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("[MercExtraEffects] OnServerDamageDealt error: " + ex)); } } private void ApplySkillTuning() { ApplyFocusedAssaultCooldown(); ApplyBlindingAssaultCooldown(); ApplyEvisDamageCoefficient(); ApplyEvisCooldown(); } private void ApplyFocusedAssaultCooldown() { //IL_001f: 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) try { float baseRechargeInterval = Mathf.Clamp(cfgFocusedAssaultCooldownSeconds.Value, 0f, 60f); SkillDef val = Addressables.LoadAssetAsync((object)"RoR2/Base/Merc/MercBodyFocusedAssault.asset").WaitForCompletion(); if ((Object)(object)val == (Object)null) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"[MercExtraEffects] Focused Assault SkillDef not found at: RoR2/Base/Merc/MercBodyFocusedAssault.asset"); return; } float baseRechargeInterval2 = val.baseRechargeInterval; val.baseRechargeInterval = baseRechargeInterval; ((BaseUnityPlugin)this).Logger.LogInfo((object)("[MercExtraEffects] Focused Assault cooldown changed: " + baseRechargeInterval2 + " -> " + val.baseRechargeInterval)); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("[MercExtraEffects] Failed to set Focused Assault cooldown: " + ex)); } } private void ApplyBlindingAssaultCooldown() { //IL_001f: 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) try { float baseRechargeInterval = Mathf.Clamp(cfgBlindingAssaultCooldownSeconds.Value, 0f, 60f); SkillDef val = Addressables.LoadAssetAsync((object)"RoR2/Base/Merc/MercBodyAssaulter.asset").WaitForCompletion(); if ((Object)(object)val == (Object)null) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"[MercExtraEffects] Blinding Assault SkillDef not found at: RoR2/Base/Merc/MercBodyAssaulter.asset"); return; } float baseRechargeInterval2 = val.baseRechargeInterval; val.baseRechargeInterval = baseRechargeInterval; ((BaseUnityPlugin)this).Logger.LogInfo((object)("[MercExtraEffects] Blinding Assault changed: " + baseRechargeInterval2 + " -> " + val.baseRechargeInterval)); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("[MercExtraEffects] Failed to set Blinding Assault cooldown: " + ex)); } } private void ApplyEvisDamageCoefficient() { try { float value = Mathf.Clamp(cfgEvisDamagePercent.Value, 0f, 5000f) / 100f; if (!TrySetStaticFloat(typeof(Evis), "damageCoefficient", value)) { TrySetStaticFloat(typeof(Evis), "baseDamageCoefficient", value); TrySetStaticFloat(typeof(Evis), "damageCoefficientPerHit", value); } } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("[MercExtraEffects] Failed to set Evis damage coefficient: " + ex)); } } private void ApplyEvisCooldown() { //IL_002f: 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) try { float baseRechargeInterval = Mathf.Clamp(cfgEvisCooldownSeconds.Value, 0f, 60f); SkillDef val = null; string[] evisSkillDefPaths = EvisSkillDefPaths; foreach (string text in evisSkillDefPaths) { try { val = Addressables.LoadAssetAsync((object)text).WaitForCompletion(); if ((Object)(object)val != (Object)null) { break; } } catch { } } if ((Object)(object)val == (Object)null) { val = FindMercSpecialSkillDefByState(typeof(EvisDash)) ?? FindMercSpecialSkillDefByState(typeof(Evis)); } if ((Object)(object)val == (Object)null) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"[MercExtraEffects] Could not find Eviscerate SkillDef to set cooldown. (Tried addressables + MercBody scan)"); return; } float baseRechargeInterval2 = val.baseRechargeInterval; val.baseRechargeInterval = baseRechargeInterval; ((BaseUnityPlugin)this).Logger.LogInfo((object)("[MercExtraEffects] Eviscerate cooldown changed: " + baseRechargeInterval2 + " -> " + val.baseRechargeInterval)); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("[MercExtraEffects] Failed to set Eviscerate cooldown: " + ex)); } } private SkillDef FindMercSpecialSkillDefByState(Type targetStateType) { try { GameObject val = BodyCatalog.FindBodyPrefab("MercBody"); if ((Object)(object)val == (Object)null) { return null; } SkillLocator component = val.GetComponent(); if ((Object)(object)component == (Object)null || (Object)(object)component.special == (Object)null) { return null; } SkillDef skillDef = component.special.skillDef; if ((Object)(object)skillDef == (Object)null) { return null; } if (((SerializableEntityStateType)(ref skillDef.activationState)).stateType == targetStateType) { return skillDef; } return null; } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("[MercExtraEffects] FindMercSpecialSkillDefByState error: " + ex.Message)); return null; } } private bool TrySetStaticFloat(Type type, string fieldName, float value) { try { FieldInfo field = type.GetField(fieldName, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); if (field == null) { return false; } if (field.FieldType != typeof(float)) { return false; } float num = (float)field.GetValue(null); field.SetValue(null, value); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[MercExtraEffects] {type.Name}.{fieldName} changed: {num} -> {value}"); return true; } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("[MercExtraEffects] Failed setting " + type.Name + "." + fieldName + ": " + ex.Message)); return false; } } } }