Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of TrueOSP v1.0.2
TrueOSP.dll
Decompiled 7 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 IL.RoR2; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.RoR2; using R2API; using R2API.Utils; using RoR2; 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("TrueOSP")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+9510261ea21423d83d64b7a590c4c870e2faf78d")] [assembly: AssemblyProduct("TrueOSP")] [assembly: AssemblyTitle("TrueOSP")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] 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; } } } namespace TrueOSP { public class OSPComponent : MonoBehaviour { public static float ospThreshold = 0.9f; public static float ospTimer = 0.5f; public static float ospInvuln = 0.5f; public CharacterBody characterBody = null; public HealthComponent healthComponent = null; private float ospStopwatch; public void Awake() { ospStopwatch = 0f; } public void FixedUpdate() { if (ospStopwatch > 0f) { ospStopwatch -= Time.fixedDeltaTime; if (ospStopwatch <= 0f && TrueOSPPlugin.enableLogging) { Debug.Log((object)"OSP timer expired."); } } } public void StartOSPTimer() { if (CanTriggerOSP()) { ospStopwatch = ospTimer; if (TrueOSPPlugin.enableLogging) { Debug.Log((object)"Starting OSP timer."); } } } public bool TriggerOSP() { bool result = false; if (CanTriggerOSP() && ospStopwatch > 0f) { result = true; ospStopwatch = 0f; characterBody.AddBuff(TrueOSPPlugin.DisableOSPBuff); characterBody.AddTimedBuff(Buffs.HiddenInvincibility, ospInvuln); characterBody.outOfDangerStopwatch = 0f; if (TrueOSPPlugin.enableLogging) { Debug.Log((object)"Triggering OSP"); } } return result; } public bool CanTriggerOSP() { return !characterBody.HasBuff(TrueOSPPlugin.DisableOSPBuff); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.Moffein.TrueOSP", "TrueOSP", "1.0.1")] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class TrueOSPPlugin : BaseUnityPlugin { public static BuffDef DisableOSPBuff; public static bool enableLogging = true; public void Awake() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown CreateBuff(); CharacterBody.RecalculateStats += new hook_RecalculateStats(CharacterBody_RecalculateStats); HealthComponent.TakeDamageProcess += new Manipulator(HealthComponent_TakeDamageProcess); } private void HealthComponent_TakeDamageProcess(ILContext il) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) bool flag = true; ILCursor val = new ILCursor(il); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallvirt<CharacterBody>(x, "get_hasOneShotProtection") })) { int index = val.Index; val.Index = index + 1; val.Emit(OpCodes.Ldarg_0); val.EmitDelegate<Func<bool, HealthComponent, bool>>((Func<bool, HealthComponent, bool>)((bool hasOSP, HealthComponent self) => HasShieldOnly(self.body) && hasOSP)); if (val.TryGotoNext(new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCall<HealthComponent>(x, "set_Networkhealth") })) { val.Emit(OpCodes.Ldarg_0); val.Emit(OpCodes.Ldarg_1); val.EmitDelegate<Func<float, HealthComponent, DamageInfo, float>>((Func<float, HealthComponent, DamageInfo, float>)ProcTrueOSP_Health); flag = false; } } if (flag) { Debug.LogError((object)"TrueOSP IL Hook failed"); } } private float ProcTrueOSP_Health(float finalHealth, HealthComponent self, DamageInfo damageInfo) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: 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) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Invalid comparison between Unknown and I4 if (!self.body.hasOneShotProtection || (int)DamageTypeCombo.op_Implicit(damageInfo.damageType & DamageTypeCombo.op_Implicit((DamageType)262144)) == 262144) { return finalHealth; } if (HasShieldOnly(self.body)) { return finalHealth; } OSPComponent oSPComponent = ((Component)self.body).gameObject.GetComponent<OSPComponent>(); if (!Object.op_Implicit((Object)(object)oSPComponent)) { oSPComponent = ((Component)self.body).gameObject.AddComponent<OSPComponent>(); oSPComponent.healthComponent = self; oSPComponent.characterBody = self.body; if (enableLogging) { Debug.Log((object)"Adding OSP Manager to player."); } } float num = self.fullHealth * OSPComponent.ospThreshold; if (self.health >= num && finalHealth < num) { oSPComponent.StartOSPTimer(); } if (finalHealth <= 0f && oSPComponent.TriggerOSP()) { finalHealth = 1f; } return finalHealth; } private void CharacterBody_RecalculateStats(orig_RecalculateStats orig, CharacterBody self) { orig.Invoke(self); if (!self.hasOneShotProtection) { return; } if (!HasShieldOnly(self)) { self.oneShotProtectionFraction = 0f; if (self.cursePenalty > 1f) { self.hasOneShotProtection = false; } } if (self.HasBuff(DisableOSPBuff)) { if (NetworkServer.active && self.outOfDanger) { self.RemoveBuff(DisableOSPBuff); } else { self.hasOneShotProtection = false; } } } private void CreateBuff() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //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) if (!Object.op_Implicit((Object)(object)DisableOSPBuff)) { BuffDef val = ScriptableObject.CreateInstance<BuffDef>(); ((Object)val).name = "TrueOSP_DisableOSPBuff"; val.canStack = false; val.isCooldown = false; val.isDebuff = false; val.buffColor = new Color(42f / 85f, 111f / 170f, 0.6741176f); val.iconSprite = Addressables.LoadAssetAsync<BuffDef>((object)"RoR2/Base/ArmorReductionOnHit/bdPulverized.asset").WaitForCompletion().iconSprite; ((Object)val).name = ((Object)val).name; ContentAddition.AddBuffDef(val); DisableOSPBuff = val; } } public static bool HasShieldOnly(CharacterBody self) { return self.HasBuff(Buffs.AffixLunar) || (Object.op_Implicit((Object)(object)self.inventory) && self.inventory.GetItemCount(Items.ShieldOnly) > 0); } } }