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 R2API Execute v1.1.2
plugins/R2API.Execute/R2API.Execute.dll
Decompiled 5 months agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using IL.RoR2.UI; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.RoR2; using R2API.AutoVersionGen; using RoR2; using RoR2.UI; using UnityEngine; using UnityEngine.Networking; [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("R2API.Execute")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.1.2.0")] [assembly: AssemblyInformationalVersion("1.1.2+4e459283c1d76de53d34cdd3bf8e3eb2ff4fb35c")] [assembly: AssemblyProduct("R2API.Execute")] [assembly: AssemblyTitle("R2API.Execute")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.2.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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] [DebuggerNonUserCode] internal sealed class MemberNotNullAttribute : Attribute { public string[] Members { get; } public MemberNotNullAttribute(string member) { Members = new string[1] { member }; } public MemberNotNullAttribute(params string[] members) { Members = members; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] [DebuggerNonUserCode] internal sealed class MemberNotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public string[] Members { get; } public MemberNotNullWhenAttribute(bool returnValue, string member) { ReturnValue = returnValue; Members = new string[1] { member }; } public MemberNotNullWhenAttribute(bool returnValue, params string[] members) { ReturnValue = returnValue; Members = members; } } } namespace R2API { [AutoVersion] public static class ExecuteAPI { public delegate void CalculateAdditiveExecuteThresholdEventHandler(CharacterBody victimBody, ref float executeFractionAdd); public delegate void CalculateAdditiveExecuteThresholdForViewerEventHandler(CharacterBody victimBody, CharacterBody viewerBody, ref float executeFractionAdd); public delegate void CalculateExecuteThresholdEventHandler(CharacterBody victimBody, ref float highestExecuteThreshold); public delegate void CalculateExecuteThresholdForViewerEventHandler(CharacterBody victimBody, CharacterBody viewerBody, ref float highestExecuteThreshold); [CompilerGenerated] private static class <>O { public static hook_ServerDamageDealt <0>__GlobalEventManager_ServerDamageDealt; public static hook_GetHealthBarValues <1>__HealthComponent_GetHealthBarValues; public static Manipulator <2>__HealthBar_UpdateBarInfos; } public const string PluginGUID = "com.bepis.r2api.execute"; public const string PluginName = "R2API.Execute"; private static bool _hooksEnabled; [Tooltip("For stackable executes with cross-mod compat. Calculates the additive execute threshold. Final threshold is calculated by the function: 1 - 1 / (1 + executeFractionAdd)")] public static CalculateAdditiveExecuteThresholdEventHandler CalculateAdditiveExecuteThreshold; [Tooltip("For stackable executes with cross-mod compat. Calculates the additive execute threshold, factoring in viewer bodies. Final threshold is calculated by the function: 1 - 1 / (1 + executeFractionAdd)")] public static CalculateAdditiveExecuteThresholdForViewerEventHandler CalculateAdditiveExecuteThresholdForViewer; [Tooltip("For vanilla-like executes that don't stack. Calculates the flat execute threshold.")] public static CalculateExecuteThresholdEventHandler CalculateExecuteThreshold; [Tooltip("For vanilla-like executes that don't stack. Calculates the flat execute threshold, factoring in viewer bodies.")] public static CalculateExecuteThresholdForViewerEventHandler CalculateExecuteThresholdForViewer; public const string PluginVersion = "1.1.2"; internal static void SetHooks() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_0038: 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_0043: Expected O, but got Unknown //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown if (!_hooksEnabled) { object obj = <>O.<0>__GlobalEventManager_ServerDamageDealt; if (obj == null) { hook_ServerDamageDealt val = GlobalEventManager_ServerDamageDealt; <>O.<0>__GlobalEventManager_ServerDamageDealt = val; obj = (object)val; } GlobalEventManager.ServerDamageDealt += (hook_ServerDamageDealt)obj; object obj2 = <>O.<1>__HealthComponent_GetHealthBarValues; if (obj2 == null) { hook_GetHealthBarValues val2 = HealthComponent_GetHealthBarValues; <>O.<1>__HealthComponent_GetHealthBarValues = val2; obj2 = (object)val2; } HealthComponent.GetHealthBarValues += (hook_GetHealthBarValues)obj2; object obj3 = <>O.<2>__HealthBar_UpdateBarInfos; if (obj3 == null) { Manipulator val3 = HealthBar_UpdateBarInfos; <>O.<2>__HealthBar_UpdateBarInfos = val3; obj3 = (object)val3; } HealthBar.UpdateBarInfos += (Manipulator)obj3; _hooksEnabled = true; } } internal static void UnsetHooks() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_0038: 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_0043: Expected O, but got Unknown //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown if (_hooksEnabled) { object obj = <>O.<0>__GlobalEventManager_ServerDamageDealt; if (obj == null) { hook_ServerDamageDealt val = GlobalEventManager_ServerDamageDealt; <>O.<0>__GlobalEventManager_ServerDamageDealt = val; obj = (object)val; } GlobalEventManager.ServerDamageDealt -= (hook_ServerDamageDealt)obj; object obj2 = <>O.<1>__HealthComponent_GetHealthBarValues; if (obj2 == null) { hook_GetHealthBarValues val2 = HealthComponent_GetHealthBarValues; <>O.<1>__HealthComponent_GetHealthBarValues = val2; obj2 = (object)val2; } HealthComponent.GetHealthBarValues -= (hook_GetHealthBarValues)obj2; object obj3 = <>O.<2>__HealthBar_UpdateBarInfos; if (obj3 == null) { Manipulator val3 = HealthBar_UpdateBarInfos; <>O.<2>__HealthBar_UpdateBarInfos = val3; obj3 = (object)val3; } HealthBar.UpdateBarInfos -= (Manipulator)obj3; _hooksEnabled = false; } } private static float ConvertAdditiveFractionToFlat(float executeFractionAdd) { return 1f - 1f / (1f + executeFractionAdd); } private static float CalculateExecuteFraction(CharacterBody victimBody, CharacterBody viewerBody) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) if ((victimBody.bodyFlags & 0x10) != 0) { return 0f; } float executeFractionAdd = 0f; float highestExecuteThreshold = 0f; CalculateAdditiveExecuteThreshold?.Invoke(victimBody, ref executeFractionAdd); CalculateExecuteThreshold?.Invoke(victimBody, ref highestExecuteThreshold); if (Object.op_Implicit((Object)(object)viewerBody)) { CalculateAdditiveExecuteThresholdForViewer?.Invoke(victimBody, viewerBody, ref executeFractionAdd); CalculateExecuteThresholdForViewer?.Invoke(victimBody, viewerBody, ref highestExecuteThreshold); } return Mathf.Max(ConvertAdditiveFractionToFlat(executeFractionAdd), highestExecuteThreshold); } private static HealthBarValues UpdateHealthBarValues(CharacterBody victimBody, CharacterBody viewerBody, HealthBarValues hbv) { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0009: 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_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)victimBody) && (victimBody.bodyFlags & 0x10) == 0 && Object.op_Implicit((Object)(object)victimBody.healthComponent)) { float num = CalculateExecuteFraction(victimBody, viewerBody); float num2 = (1f - hbv.curseFraction) / victimBody.healthComponent.fullCombinedHealth; float num3 = Mathf.Clamp01(num * victimBody.healthComponent.fullCombinedHealth * num2); hbv.cullFraction = Mathf.Max(hbv.cullFraction, num3); } return hbv; } private static void TryExecuteServer(CharacterBody victimBody, DamageReport damageReport) { HealthComponent healthComponent = victimBody.healthComponent; float combinedHealthFraction = healthComponent.combinedHealthFraction; float num = CalculateExecuteFraction(victimBody, damageReport.attackerBody); if (num > 0f && combinedHealthFraction <= num) { float num2 = Mathf.Max(healthComponent.combinedHealth, 0f); if (healthComponent.barrier > 0f) { healthComponent.barrier = 0f; } if (healthComponent.shield > 0f) { healthComponent.shield = 0f; } if (healthComponent.health > 0f) { healthComponent.health = 0f; } GlobalEventManager.ServerCharacterExecuted(damageReport, num2); } } private static void HealthBar_UpdateBarInfos(ILContext il) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); int healthBarValueLoc = -1; if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref healthBarValueLoc), (Instruction x) => ILPatternMatchingExt.MatchLdfld<HealthBarValues>(x, "cullFraction") })) { val.Emit(OpCodes.Ldarg_0); val.Emit(OpCodes.Ldloc, healthBarValueLoc); val.EmitDelegate<Func<float, HealthBar, HealthBarValues, float>>((Func<float, HealthBar, HealthBarValues, float>)delegate(float origCullFraction, HealthBar self, HealthBarValues healthBarValues) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)self.viewerBody) && Object.op_Implicit((Object)(object)self.source) && Object.op_Implicit((Object)(object)self.source.body)) { healthBarValues = UpdateHealthBarValues(self.source.body, self.viewerBody, healthBarValues); return Mathf.Max(origCullFraction, healthBarValues.cullFraction); } return origCullFraction; }); } else { ExecutePlugin.Logger.LogError((object)"HealthBar_UpdateBarInfos IL hook failed."); } } private static HealthBarValues HealthComponent_GetHealthBarValues(orig_GetHealthBarValues orig, HealthComponent self) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) return UpdateHealthBarValues(self.body, null, orig.Invoke(self)); } private static void GlobalEventManager_ServerDamageDealt(orig_ServerDamageDealt orig, DamageReport damageReport) { //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) orig.Invoke(damageReport); if (NetworkServer.active && Object.op_Implicit((Object)(object)damageReport.victimBody) && (damageReport.victimBody.bodyFlags & 0x10) == 0 && Object.op_Implicit((Object)(object)damageReport.victimBody.healthComponent) && damageReport.victimBody.healthComponent.alive) { TryExecuteServer(damageReport.victimBody, damageReport); } } } [BepInPlugin("com.bepis.r2api.execute", "R2API.Execute", "1.1.2")] public sealed class ExecutePlugin : BaseUnityPlugin { internal static ManualLogSource Logger { get; set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; ExecuteAPI.SetHooks(); } private void OnDestroy() { ExecuteAPI.UnsetHooks(); } } } namespace R2API.AutoVersionGen { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] internal class AutoVersionAttribute : Attribute { } }