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 WandererRNoSelfDamage v1.0.2
plugins/WandererRNoSelfDamage.dll
Decompiled 2 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Microsoft.CodeAnalysis; using RoR2; using UnityEngine; 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: AssemblyVersion("0.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 NormalAIPeople.WandererRNoSelfDamage { [BepInPlugin("normalAIPeople.WandererRNoSelfDamage", "Wanderer R No Self Damage", "1.0.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] public sealed class WandererRNoSelfDamagePlugin : BaseUnityPlugin { private static ConfigEntry<float> guardDuration; private static readonly Dictionary<CharacterBody, float> activeR = new Dictionary<CharacterBody, float>(); private void Awake() { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Expected O, but got Unknown //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Expected O, but got Unknown //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Expected O, but got Unknown //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Expected O, but got Unknown guardDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Wanderer", "R Self-Damage Guard Duration", 3f, "Maximum R duration in seconds. Only self-inflicted damage is blocked; enemy and environmental damage are unchanged."); Type type = AccessTools.TypeByName("UnforgivenMod.Unforgiven.SkillStates.DashSpecial"); if (!(type == null)) { Harmony val = new Harmony("normalAIPeople.WandererRNoSelfDamage"); val.Patch((MethodBase)AccessTools.Method(type, "OnEnter", (Type[])null, (Type[])null), new HarmonyMethod(typeof(WandererRNoSelfDamagePlugin), "ROnEnterPrefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Type type2 = AccessTools.TypeByName("UnforgivenMod.Unforgiven.SkillStates.Special"); if (type2 != null) { val.Patch((MethodBase)AccessTools.Method(type2, "OnEnter", (Type[])null, (Type[])null), new HarmonyMethod(typeof(WandererRNoSelfDamagePlugin), "ROnEnterPrefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.Method(type2, "OnExit", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(WandererRNoSelfDamagePlugin), "ROnExitPostfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } val.Patch((MethodBase)AccessTools.Method(typeof(HealthComponent), "TakeDamage", (Type[])null, (Type[])null), new HarmonyMethod(typeof(WandererRNoSelfDamagePlugin), "SelfDamagePrefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); MethodInfo methodInfo = AccessTools.Method(typeof(DotController), "InflictDot", new Type[1] { typeof(InflictDotInfo).MakeByRefType() }, (Type[])null); if (methodInfo != null) { val.Patch((MethodBase)methodInfo, new HarmonyMethod(typeof(WandererRNoSelfDamagePlugin), "SelfDotPrefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } } private static void ROnEnterPrefix(object __instance) { //IL_0022: 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) CharacterBody value = Traverse.Create(__instance).Property("characterBody", (object[])null).GetValue<CharacterBody>(); if ((Object)(object)value != (Object)null && value.bodyIndex == BodyCatalog.FindBodyIndex("UnforgivenBody")) { activeR[value] = Time.fixedTime + Math.Max(0f, guardDuration.Value); } } private static void ROnExitPostfix(object __instance) { CharacterBody value = Traverse.Create(__instance).Property("characterBody", (object[])null).GetValue<CharacterBody>(); if ((Object)(object)value != (Object)null && activeR.TryGetValue(value, out var value2)) { activeR[value] = Math.Max(value2, Time.fixedTime + 0.5f); } } private static bool IsRActive(CharacterBody body) { //IL_000b: 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) if ((Object)(object)body == (Object)null || body.bodyIndex != BodyCatalog.FindBodyIndex("UnforgivenBody")) { return false; } if (!activeR.TryGetValue(body, out var value)) { return false; } if (Time.fixedTime <= value) { return true; } activeR.Remove(body); return false; } private static bool SelfDamagePrefix(HealthComponent __instance, DamageInfo damageInfo) { //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Invalid comparison between Unknown and I4 if (!NetworkServer.active || (Object)(object)__instance == (Object)null || (Object)(object)__instance.body == (Object)null) { return true; } CharacterBody body = __instance.body; if (!IsRActive(body)) { return true; } bool flag = (Object)(object)damageInfo.attacker == (Object)(object)((Component)body).gameObject || (Object)(object)damageInfo.inflictor == (Object)(object)((Component)body).gameObject; bool flag2 = (Object)(object)damageInfo.attacker == (Object)null && (Object)(object)damageInfo.inflictor == (Object)null && (int)damageInfo.damageType.damageSource == 8; return !flag && !flag2; } private static bool SelfDotPrefix(ref InflictDotInfo inflictDotInfo) { if (!NetworkServer.active || (Object)(object)inflictDotInfo.victimObject == (Object)null) { return true; } CharacterBody component = inflictDotInfo.victimObject.GetComponent<CharacterBody>(); if (!IsRActive(component)) { return true; } return (Object)(object)inflictDotInfo.attackerObject != (Object)null && (Object)(object)inflictDotInfo.attackerObject != (Object)(object)((Component)component).gameObject; } } }