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 Dot v1.1.2
plugins/R2API.Dot/R2API.Dot.dll
Decompiled 5 months 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 BepInEx; using BepInEx.Logging; using IL.RoR2; using Microsoft.CodeAnalysis; using Mono.Cecil; using Mono.Cecil.Cil; using MonoMod.Cil; using On.RoR2; using R2API.AutoVersionGen; using R2API.Utils; using RoR2; 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.Dot")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.1.2.0")] [assembly: AssemblyInformationalVersion("1.1.2+72fb4acded8caa7a86ab495cc2762c4ae961b47b")] [assembly: AssemblyProduct("R2API.Dot")] [assembly: AssemblyTitle("R2API.Dot")] [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 DotAPI { public delegate void CustomDotBehaviour(DotController self, DotStack dotStack); public delegate void CustomDotVisual(DotController self); public delegate void CustomDotDamageEvaluation(DotController self, PendingDamage pendingDamage); [CompilerGenerated] private static class <>O { public static Manipulator <0>__RetrieveVanillaCount; public static Manipulator <1>__ResizeTimerArray; public static hook_InitDotCatalog <2>__AddCustomDots; public static hook_Awake <3>__TrackActiveCustomDots; public static hook_OnDestroy <4>__TrackActiveCustomDots2; public static hook_GetDotDef <5>__GetDotDefSupportCustomDefs; public static hook_FixedUpdate <6>__FixedUpdateEvaluateCustomDotStacksAndVisuals; public static Manipulator <7>__FixInflictDotReturnCheck; public static Manipulator <8>__CallCustomDotBehaviours; public static hook_HasDotActive <9>__OnHasDotActive; public static Manipulator <10>__EvaluateDotStacksForType; public static Manipulator <11>__FixDeathMark; public static Func<DotController, int, int> <12>__CountCustomDots; } public const string PluginGUID = "com.bepis.r2api.dot"; public const string PluginName = "R2API.Dot"; private static readonly List<DotDef> CustomDots = new List<DotDef>(); public static int VanillaDotCount; private static readonly Dictionary<DotController, bool[]> ActiveCustomDots = new Dictionary<DotController, bool[]>(); private static CustomDotBehaviour[] _customDotBehaviours = new CustomDotBehaviour[0]; private static CustomDotVisual[] _customDotVisuals = new CustomDotVisual[0]; private static CustomDotDamageEvaluation[] _customDotDamageEvaluations = new CustomDotDamageEvaluation[0]; private static bool _hooksEnabled = false; public const string PluginVersion = "1.1.2"; [Obsolete("All submodules are automatically loaded and this property is now unused")] public static bool Loaded => true; private static DotDef[] DotDefs { get { return DotController.dotDefs; } set { DotController.dotDefs = value; } } public static int CustomDotCount => CustomDots.Count; private static void ResizeDotDefs(int newSize) { DotDef[] array = DotDefs; Array.Resize(ref array, newSize); DotDefs = array; } public static DotIndex RegisterDotDef(DotDef? dotDef, CustomDotBehaviour? customDotBehaviour = null, CustomDotVisual? customDotVisual = null, CustomDotDamageEvaluation? customDotDamageEvaluation = null) { SetHooks(); int num = VanillaDotCount + CustomDotCount; if (DotDefs != null) { ResizeDotDefs(num + 1); DotDefs[num] = dotDef; } CustomDots.Add(dotDef); int num2 = _customDotBehaviours.Length; Array.Resize(ref _customDotBehaviours, _customDotBehaviours.Length + 1); _customDotBehaviours[num2] = customDotBehaviour; Array.Resize(ref _customDotVisuals, _customDotVisuals.Length + 1); _customDotVisuals[num2] = customDotVisual; Array.Resize(ref _customDotDamageEvaluations, _customDotDamageEvaluations.Length + 1); _customDotDamageEvaluations[num2] = customDotDamageEvaluation; if ((Object)(object)dotDef.associatedBuff != (Object)null) { DotPlugin.Logger.LogInfo((object)$"Custom Dot (Index: {num}) that uses Buff : {((Object)dotDef.associatedBuff).name} added"); } else { DotPlugin.Logger.LogInfo((object)$"Custom Dot (Index: {num}) with no associated Buff added"); } return (DotIndex)num; } public static DotIndex RegisterDotDef(DotDef? dotDef, CustomDotBehaviour? customDotBehaviour, CustomDotVisual? customDotVisual) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) SetHooks(); return RegisterDotDef(dotDef, customDotBehaviour, customDotVisual, null); } public static DotIndex RegisterDotDef(float interval, float damageCoefficient, DamageColorIndex colorIndex, BuffDef associatedBuff = null, CustomDotBehaviour customDotBehaviour = null, CustomDotVisual customDotVisual = null, CustomDotDamageEvaluation customDotDamageEvaluation = null) { //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_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0020: 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_002f: Expected O, but got Unknown //IL_002a: Unknown result type (might be due to invalid IL or missing references) SetHooks(); return RegisterDotDef(new DotDef { associatedBuff = associatedBuff, damageCoefficient = damageCoefficient, interval = interval, damageColorIndex = colorIndex }, customDotBehaviour, customDotVisual); } public static DotIndex RegisterDotDef(float interval, float damageCoefficient, DamageColorIndex colorIndex, BuffDef associatedBuff, CustomDotBehaviour customDotBehaviour, CustomDotVisual customDotVisual) { //IL_0007: 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) SetHooks(); return RegisterDotDef(interval, damageCoefficient, colorIndex, associatedBuff, customDotBehaviour, customDotVisual, null); } 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 //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Expected O, but got Unknown //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Expected O, but got Unknown //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Expected O, but got Unknown //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Expected O, but got Unknown //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Expected O, but got Unknown //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Expected O, but got Unknown //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Expected O, but got Unknown if (!_hooksEnabled) { object obj = <>O.<0>__RetrieveVanillaCount; if (obj == null) { Manipulator val = RetrieveVanillaCount; <>O.<0>__RetrieveVanillaCount = val; obj = (object)val; } DotController.InitDotCatalog += (Manipulator)obj; object obj2 = <>O.<1>__ResizeTimerArray; if (obj2 == null) { Manipulator val2 = ResizeTimerArray; <>O.<1>__ResizeTimerArray = val2; obj2 = (object)val2; } DotController.Awake += (Manipulator)obj2; object obj3 = <>O.<2>__AddCustomDots; if (obj3 == null) { hook_InitDotCatalog val3 = AddCustomDots; <>O.<2>__AddCustomDots = val3; obj3 = (object)val3; } DotController.InitDotCatalog += (hook_InitDotCatalog)obj3; object obj4 = <>O.<3>__TrackActiveCustomDots; if (obj4 == null) { hook_Awake val4 = TrackActiveCustomDots; <>O.<3>__TrackActiveCustomDots = val4; obj4 = (object)val4; } DotController.Awake += (hook_Awake)obj4; object obj5 = <>O.<4>__TrackActiveCustomDots2; if (obj5 == null) { hook_OnDestroy val5 = TrackActiveCustomDots2; <>O.<4>__TrackActiveCustomDots2 = val5; obj5 = (object)val5; } DotController.OnDestroy += (hook_OnDestroy)obj5; object obj6 = <>O.<5>__GetDotDefSupportCustomDefs; if (obj6 == null) { hook_GetDotDef val6 = GetDotDefSupportCustomDefs; <>O.<5>__GetDotDefSupportCustomDefs = val6; obj6 = (object)val6; } DotController.GetDotDef += (hook_GetDotDef)obj6; object obj7 = <>O.<6>__FixedUpdateEvaluateCustomDotStacksAndVisuals; if (obj7 == null) { hook_FixedUpdate val7 = FixedUpdateEvaluateCustomDotStacksAndVisuals; <>O.<6>__FixedUpdateEvaluateCustomDotStacksAndVisuals = val7; obj7 = (object)val7; } DotController.FixedUpdate += (hook_FixedUpdate)obj7; object obj8 = <>O.<7>__FixInflictDotReturnCheck; if (obj8 == null) { Manipulator val8 = FixInflictDotReturnCheck; <>O.<7>__FixInflictDotReturnCheck = val8; obj8 = (object)val8; } DotController.InflictDot_refInflictDotInfo += (Manipulator)obj8; object obj9 = <>O.<8>__CallCustomDotBehaviours; if (obj9 == null) { Manipulator val9 = CallCustomDotBehaviours; <>O.<8>__CallCustomDotBehaviours = val9; obj9 = (object)val9; } DotController.AddDot_GameObject_float_HurtBox_DotIndex_float_Nullable1_Nullable1_Nullable1 += (Manipulator)obj9; object obj10 = <>O.<9>__OnHasDotActive; if (obj10 == null) { hook_HasDotActive val10 = OnHasDotActive; <>O.<9>__OnHasDotActive = val10; obj10 = (object)val10; } DotController.HasDotActive += (hook_HasDotActive)obj10; object obj11 = <>O.<10>__EvaluateDotStacksForType; if (obj11 == null) { Manipulator val11 = EvaluateDotStacksForType; <>O.<10>__EvaluateDotStacksForType = val11; obj11 = (object)val11; } DotController.EvaluateDotStacksForType += (Manipulator)obj11; object obj12 = <>O.<11>__FixDeathMark; if (obj12 == null) { Manipulator val12 = FixDeathMark; <>O.<11>__FixDeathMark = val12; obj12 = (object)val12; } GlobalEventManager.ProcDeathMark += (Manipulator)obj12; _hooksEnabled = true; } } internal static void UnsetHooks() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Expected O, but got Unknown //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Expected O, but got Unknown //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Expected O, but got Unknown //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Expected O, but got Unknown //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Expected O, but got Unknown //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Expected O, but got Unknown //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Expected O, but got Unknown //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Expected O, but got Unknown object obj = <>O.<0>__RetrieveVanillaCount; if (obj == null) { Manipulator val = RetrieveVanillaCount; <>O.<0>__RetrieveVanillaCount = val; obj = (object)val; } DotController.InitDotCatalog -= (Manipulator)obj; object obj2 = <>O.<1>__ResizeTimerArray; if (obj2 == null) { Manipulator val2 = ResizeTimerArray; <>O.<1>__ResizeTimerArray = val2; obj2 = (object)val2; } DotController.Awake -= (Manipulator)obj2; object obj3 = <>O.<3>__TrackActiveCustomDots; if (obj3 == null) { hook_Awake val3 = TrackActiveCustomDots; <>O.<3>__TrackActiveCustomDots = val3; obj3 = (object)val3; } DotController.Awake -= (hook_Awake)obj3; object obj4 = <>O.<4>__TrackActiveCustomDots2; if (obj4 == null) { hook_OnDestroy val4 = TrackActiveCustomDots2; <>O.<4>__TrackActiveCustomDots2 = val4; obj4 = (object)val4; } DotController.OnDestroy -= (hook_OnDestroy)obj4; object obj5 = <>O.<5>__GetDotDefSupportCustomDefs; if (obj5 == null) { hook_GetDotDef val5 = GetDotDefSupportCustomDefs; <>O.<5>__GetDotDefSupportCustomDefs = val5; obj5 = (object)val5; } DotController.GetDotDef -= (hook_GetDotDef)obj5; object obj6 = <>O.<6>__FixedUpdateEvaluateCustomDotStacksAndVisuals; if (obj6 == null) { hook_FixedUpdate val6 = FixedUpdateEvaluateCustomDotStacksAndVisuals; <>O.<6>__FixedUpdateEvaluateCustomDotStacksAndVisuals = val6; obj6 = (object)val6; } DotController.FixedUpdate -= (hook_FixedUpdate)obj6; object obj7 = <>O.<7>__FixInflictDotReturnCheck; if (obj7 == null) { Manipulator val7 = FixInflictDotReturnCheck; <>O.<7>__FixInflictDotReturnCheck = val7; obj7 = (object)val7; } DotController.InflictDot_refInflictDotInfo -= (Manipulator)obj7; object obj8 = <>O.<8>__CallCustomDotBehaviours; if (obj8 == null) { Manipulator val8 = CallCustomDotBehaviours; <>O.<8>__CallCustomDotBehaviours = val8; obj8 = (object)val8; } DotController.AddDot_GameObject_float_HurtBox_DotIndex_float_Nullable1_Nullable1_Nullable1 -= (Manipulator)obj8; object obj9 = <>O.<9>__OnHasDotActive; if (obj9 == null) { hook_HasDotActive val9 = OnHasDotActive; <>O.<9>__OnHasDotActive = val9; obj9 = (object)val9; } DotController.HasDotActive -= (hook_HasDotActive)obj9; object obj10 = <>O.<10>__EvaluateDotStacksForType; if (obj10 == null) { Manipulator val10 = EvaluateDotStacksForType; <>O.<10>__EvaluateDotStacksForType = val10; obj10 = (object)val10; } DotController.EvaluateDotStacksForType -= (Manipulator)obj10; object obj11 = <>O.<11>__FixDeathMark; if (obj11 == null) { Manipulator val11 = FixDeathMark; <>O.<11>__FixDeathMark = val11; obj11 = (object)val11; } GlobalEventManager.ProcDeathMark -= (Manipulator)obj11; _hooksEnabled = false; } private static void EvaluateDotStacksForType(ILContext il) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); int pendingDamageLocNumber = 0; int num5 = default(int); if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[4] { (Instruction i) => ILPatternMatchingExt.MatchLdarg(i, 0), (Instruction i) => ILPatternMatchingExt.MatchCallOrCallvirt(i, (MethodBase)Reflection.GetPropertyGetter(typeof(DotController), "victimHealthComponent")), (Instruction i) => ILPatternMatchingExt.MatchLdloc(i, ref num5), (Instruction i) => ILPatternMatchingExt.MatchCallOrCallvirt<HealthComponent>(i, "TakeDamage") })) { Instruction next = val.Next; Instruction next2 = val.Next.Next.Next.Next.Next; ILLabel val2 = default(ILLabel); int num4 = default(int); int num3 = default(int); if (val.TryGotoPrev((MoveType)0, new Func<Instruction, bool>[4] { (Instruction i) => ILPatternMatchingExt.MatchStloc(i, ref pendingDamageLocNumber), (Instruction i) => ILPatternMatchingExt.MatchBr(i, ref val2), (Instruction i) => ILPatternMatchingExt.MatchLdloc(i, ref num4), (Instruction i) => ILPatternMatchingExt.MatchLdloc(i, ref num3) })) { val.Goto(next2, (MoveType)0, false); next2 = val.Emit(OpCodes.Ldarg_0).Prev; val.Emit(OpCodes.Ldarg_1); val.Emit(OpCodes.Ldloc_0); val.Emit(OpCodes.Ldloc, pendingDamageLocNumber); val.EmitDelegate<Func<List<PendingDamage>, int, PendingDamage>>((Func<List<PendingDamage>, int, PendingDamage>)((List<PendingDamage> list, int index) => list[index])); val.EmitDelegate<Action<DotController, DotIndex, PendingDamage>>((Action<DotController, DotIndex, PendingDamage>)delegate(DotController self, DotIndex dotIndex, PendingDamage pendingDamage) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 //IL_0008: 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) //IL_0010: Expected I4, but got Unknown if ((int)dotIndex >= VanillaDotCount) { int num2 = dotIndex - VanillaDotCount; _customDotDamageEvaluations[num2]?.Invoke(self, pendingDamage); } }); val.Goto(next, (MoveType)0, false); val.Emit(OpCodes.Ldarg_1); val.EmitDelegate<Func<DotIndex, bool>>((Func<DotIndex, bool>)delegate(DotIndex dotIndex) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 //IL_000a: 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_0012: Expected I4, but got Unknown bool result = true; if ((int)dotIndex >= VanillaDotCount) { int num = dotIndex - VanillaDotCount; result = _customDotDamageEvaluations[num] == null; } return result; }); val.Emit(OpCodes.Brfalse_S, next2); } else { ILFailMessage(2); } } else { ILFailMessage(1); } static void ILFailMessage(int index) { DotPlugin.Logger.LogError((object)$"Failed finding IL Instructions. Aborting OnEvaluateDotStacksForType IL Hook {index}"); } } private static void RetrieveVanillaCount(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if (!new ILCursor(il).TryGotoNext(new Func<Instruction, bool>[2] { (Instruction i) => ILPatternMatchingExt.MatchLdcI4(i, ref VanillaDotCount), (Instruction i) => ILPatternMatchingExt.MatchNewarr<DotDef>(i) })) { DotPlugin.Logger.LogError((object)"Failed finding IL Instructions. Aborting RetrieveVanillaCount IL Hook"); } } private static void ResizeTimerArray(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[2] { (Instruction i) => ILPatternMatchingExt.MatchLdcI4(i, VanillaDotCount), (Instruction i) => ILPatternMatchingExt.MatchNewarr<float>(i) })) { int index = val.Index; val.Index = index + 1; val.EmitDelegate<Func<int, int>>((Func<int, int>)((int i) => DotDefs.Length)); } else { DotPlugin.Logger.LogError((object)"Failed finding IL Instructions. Aborting ResizeTimerArray IL Hook"); } } private static void AddCustomDots(orig_InitDotCatalog orig) { orig.Invoke(); DotController.dotDefs = DotController.dotDefs.Concat(CustomDots).ToArray(); } private static void TrackActiveCustomDots(orig_Awake orig, DotController self) { orig.Invoke(self); ActiveCustomDots.Add(self, new bool[CustomDotCount]); } private static void TrackActiveCustomDots2(orig_OnDestroy orig, DotController self) { orig.Invoke(self); ActiveCustomDots.Remove(self); } private static DotDef GetDotDefSupportCustomDefs(orig_GetDotDef orig, DotIndex dotIndex) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return DotDefs[dotIndex]; } private static void FixedUpdateEvaluateCustomDotStacksAndVisuals(orig_FixedUpdate orig, DotController self) { orig.Invoke(self); if (NetworkServer.active) { int num2 = default(int); for (int i = VanillaDotCount; i < DotDefs.Length; i++) { DotDef val = DotDefs[i]; float[] dotTimers = self.dotTimers; float num = dotTimers[i] - Time.fixedDeltaTime; if (num <= 0f) { num += val.interval; self.EvaluateDotStacksForType((DotIndex)i, val.interval, ref num2); ActiveCustomDots[self][i - VanillaDotCount] = num2 != 0; } dotTimers[i] = num; } } for (int j = 0; j < CustomDotCount; j++) { try { if (ActiveCustomDots[self][j]) { _customDotVisuals[j]?.Invoke(self); } } catch (Exception ex) { DotPlugin.Logger.LogError((object)ex); } } } private static void FixInflictDotReturnCheck(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0082: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[3] { (Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 0), (Instruction x) => ILPatternMatchingExt.MatchLdfld(x, typeof(InflictDotInfo), "dotIndex"), (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, VanillaDotCount) })) { val.Prev.OpCode = OpCodes.Ldc_I4; val.Prev.Operand = int.MaxValue; } else { ILFailMessage(1); } static void ILFailMessage(int index) { DotPlugin.Logger.LogError((object)$"Failed finding IL Instructions. Aborting FixInflictDotReturnCheck IL Hook {index}"); } } private static void CallCustomDotBehaviours(ILContext il) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); int dotStackLoc = 0; MethodReference val2 = default(MethodReference); if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[3] { (Instruction i) => ILPatternMatchingExt.MatchLdsfld<DotController>(i, "dotStackPool"), (Instruction i) => ILPatternMatchingExt.MatchCallOrCallvirt(i, ref val2), (Instruction i) => ILPatternMatchingExt.MatchStloc(i, ref dotStackLoc) })) { int num2 = default(int); ILLabel[] array = default(ILLabel[]); if (val.TryGotoNext(new Func<Instruction, bool>[2] { (Instruction i) => ILPatternMatchingExt.MatchLdarg(i, ref num2), (Instruction i) => ILPatternMatchingExt.MatchSwitch(i, ref array) })) { val.Emit(OpCodes.Ldarg_0); val.Emit(OpCodes.Ldloc, dotStackLoc); val.EmitDelegate<Action<DotController, DotStack>>((Action<DotController, DotStack>)delegate(DotController self, DotStack dotStack) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Invalid comparison between Unknown and I4 //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected I4, but got Unknown if ((int)dotStack.dotIndex >= VanillaDotCount) { int num = dotStack.dotIndex - VanillaDotCount; _customDotBehaviours[num]?.Invoke(self, dotStack); ActiveCustomDots[self][num] = true; } }); } else { ILFailMessage(2); } } else { ILFailMessage(1); } static void ILFailMessage(int index) { DotPlugin.Logger.LogError((object)$"Failed finding IL Instructions. Aborting OnAddDot IL Hook {index}"); } } private static bool OnHasDotActive(orig_HasDotActive orig, DotController self, DotIndex dotIndex) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) if ((int)dotIndex >= VanillaDotCount) { if (ActiveCustomDots.TryGetValue(self, out bool[] value)) { return value[dotIndex - VanillaDotCount]; } return false; } return orig.Invoke(self, dotIndex); } private static void FixDeathMark(ILContext il) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); int dotControllerLoc = 0; int numberOfDebuffAndDotLoc2 = 0; if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction i) => ILPatternMatchingExt.MatchCallOrCallvirt(i, typeof(DotController), "HasDotActive") })) { if (!val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction i) => ILPatternMatchingExt.MatchLdloc(i, ref numberOfDebuffAndDotLoc2) })) { ILFailMessage(2); } } else { ILFailMessage(1); } if (val.TryGotoPrev((MoveType)2, new Func<Instruction, bool>[2] { (Instruction i) => ILPatternMatchingExt.MatchCallOrCallvirt(i, typeof(DotController), "FindDotController"), (Instruction i) => ILPatternMatchingExt.MatchStloc(i, ref dotControllerLoc) })) { val.Emit(OpCodes.Ldloc, dotControllerLoc); val.Emit(OpCodes.Ldloc, numberOfDebuffAndDotLoc2); val.EmitDelegate<Func<DotController, int, int>>((Func<DotController, int, int>)CountCustomDots); val.Emit(OpCodes.Stloc, numberOfDebuffAndDotLoc2); } else { ILFailMessage(3); } static int CountCustomDots(DotController dotController, int numberOfDebuffAndDotLoc) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)dotController)) { for (int j = VanillaDotCount; j < VanillaDotCount + CustomDotCount; j++) { DotIndex val2 = (DotIndex)j; if (dotController.HasDotActive(val2)) { numberOfDebuffAndDotLoc++; } } } return numberOfDebuffAndDotLoc; } static void ILFailMessage(int index) { DotPlugin.Logger.LogError((object)$"Failed finding IL Instructions. Aborting FixDeathMark IL Hook {index}"); } } } [BepInPlugin("com.bepis.r2api.dot", "R2API.Dot", "1.1.2")] public sealed class DotPlugin : BaseUnityPlugin { internal static ManualLogSource Logger { get; set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; } private void OnDestroy() { DotAPI.UnsetHooks(); } } } namespace R2API.AutoVersionGen { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] internal class AutoVersionAttribute : Attribute { } }