Decompiled source of FallDamageChanges v1.0.1

FallDamageChanges.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
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 BepInEx.Logging;
using IL.RoR2;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.RoR2;
using RoR2;
using UnityEngine;

[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("FallDamageChanges")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+25faa179a6fa330c415aa92ee02db0e09321e0af")]
[assembly: AssemblyProduct("FallDamageChanges")]
[assembly: AssemblyTitle("FallDamageChanges")]
[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 LimitedInteractables
{
	[BepInPlugin("prodzpod.FallDamageChanges", "FallDamageChanges", "1.0.0")]
	public class Main : BaseUnityPlugin
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static hook_OnTeleport <>9__16_0;

			public static Func<Instruction, bool> <>9__16_3;

			public static Func<float, CharacterBody, float> <>9__16_4;

			public static Func<Instruction, bool> <>9__16_5;

			public static Func<DamageInfo, DamageInfo> <>9__16_6;

			public static Manipulator <>9__16_1;

			public static hook_OnCharacterHitGroundServer <>9__16_2;

			internal void <Awake>b__16_0(orig_OnTeleport orig, GameObject obj, Vector3 pos, Vector3 vel)
			{
				//IL_0003: Unknown result type (might be due to invalid IL or missing references)
				//IL_0004: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				orig.Invoke(obj, pos, vel);
				if (!(vel.y <= 0f))
				{
					CharacterBody component = obj.GetComponent<CharacterBody>();
					if (!oob.Contains(component))
					{
						oob.Add(component);
					}
				}
			}

			internal void <Awake>b__16_1(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				//IL_0038: Unknown result type (might be due to invalid IL or missing references)
				ILCursor val = new ILCursor(il);
				val.GotoNext(new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchStloc(x, 4)
				});
				val.Emit(OpCodes.Ldarg_1);
				val.EmitDelegate<Func<float, CharacterBody, float>>((Func<float, CharacterBody, float>)delegate(float orig, CharacterBody self)
				{
					orig *= FallMultiplier.Value;
					if (oob.Contains(self))
					{
						orig *= OOBMultiplier.Value;
					}
					float num = MathF.Max(self.healthComponent.health - orig * self.maxHealth / 60f, FallThreshold.Value * self.maxHealth);
					if (oob.Contains(self))
					{
						num = MathF.Max(num, OOBThreshold.Value * self.maxHealth);
					}
					return <Awake>g__inverseHP|16_7(num, self);
				});
				val.GotoNext(new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<HealthComponent>(x, "TakeDamage")
				});
				val.EmitDelegate<Func<DamageInfo, DamageInfo>>((Func<DamageInfo, DamageInfo>)delegate(DamageInfo info)
				{
					//IL_003a: Unknown result type (might be due to invalid IL or missing references)
					//IL_0041: 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)
					//IL_004b: Unknown result type (might be due to invalid IL or missing references)
					//IL_0052: Unknown result type (might be due to invalid IL or missing references)
					//IL_005c: 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)
					//IL_0066: Unknown result type (might be due to invalid IL or missing references)
					bool flag = Run.instance.runRNG.RangeFloat(0f, 1f) < CritFall.Value;
					if (FallIsLethal.Value || flag)
					{
						info.damageType &= DamageTypeCombo.op_Implicit((DamageType)(-2));
						info.damageType |= DamageTypeCombo.op_Implicit((DamageType)262144);
					}
					if (flag)
					{
						info.crit = true;
					}
					return info;
				});
			}

			internal bool <Awake>b__16_3(Instruction x)
			{
				return ILPatternMatchingExt.MatchStloc(x, 4);
			}

			internal float <Awake>b__16_4(float orig, CharacterBody self)
			{
				orig *= FallMultiplier.Value;
				if (oob.Contains(self))
				{
					orig *= OOBMultiplier.Value;
				}
				float num = MathF.Max(self.healthComponent.health - orig * self.maxHealth / 60f, FallThreshold.Value * self.maxHealth);
				if (oob.Contains(self))
				{
					num = MathF.Max(num, OOBThreshold.Value * self.maxHealth);
				}
				return <Awake>g__inverseHP|16_7(num, self);
			}

			internal bool <Awake>b__16_5(Instruction x)
			{
				return ILPatternMatchingExt.MatchCallOrCallvirt<HealthComponent>(x, "TakeDamage");
			}

			internal DamageInfo <Awake>b__16_6(DamageInfo info)
			{
				//IL_003a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0041: 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)
				//IL_004b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0052: Unknown result type (might be due to invalid IL or missing references)
				//IL_005c: 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)
				//IL_0066: Unknown result type (might be due to invalid IL or missing references)
				bool flag = Run.instance.runRNG.RangeFloat(0f, 1f) < CritFall.Value;
				if (FallIsLethal.Value || flag)
				{
					info.damageType &= DamageTypeCombo.op_Implicit((DamageType)(-2));
					info.damageType |= DamageTypeCombo.op_Implicit((DamageType)262144);
				}
				if (flag)
				{
					info.crit = true;
				}
				return info;
			}

			internal void <Awake>b__16_2(orig_OnCharacterHitGroundServer orig, GlobalEventManager self, CharacterBody body, HitGroundInfo vel)
			{
				//IL_0004: Unknown result type (might be due to invalid IL or missing references)
				orig.Invoke(self, body, vel);
				body.healthComponent.ospTimer = (oob.Contains(body) ? OOBIFrames.Value : FallIFrames.Value);
				oob.Remove(body);
			}
		}

		public const string PluginGUID = "prodzpod.FallDamageChanges";

		public const string PluginAuthor = "prodzpod";

		public const string PluginName = "FallDamageChanges";

		public const string PluginVersion = "1.0.0";

		public static ManualLogSource Log;

		public static PluginInfo pluginInfo;

		public static ConfigFile Config;

		public static ConfigEntry<bool> FallIsLethal;

		public static ConfigEntry<float> FallMultiplier;

		public static ConfigEntry<float> OOBMultiplier;

		public static ConfigEntry<float> FallThreshold;

		public static ConfigEntry<float> OOBThreshold;

		public static ConfigEntry<float> FallIFrames;

		public static ConfigEntry<float> OOBIFrames;

		public static ConfigEntry<float> CritFall;

		public static List<CharacterBody> oob = new List<CharacterBody>();

		public void Awake()
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Expected O, but got Unknown
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Expected O, but got Unknown
			//IL_01a3: 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_01ae: Expected O, but got Unknown
			pluginInfo = ((BaseUnityPlugin)this).Info;
			Log = ((BaseUnityPlugin)this).Logger;
			Config = new ConfigFile(Path.Combine(Paths.ConfigPath, "prodzpod.FallDamageChanges.cfg"), true);
			FallIsLethal = Config.Bind<bool>("General", "Fall Damage is Lethal", false, "Eclipse Real??");
			FallMultiplier = Config.Bind<float>("General", "Fall Damage Multiplier", 1f, "Affects all fall damage.");
			OOBMultiplier = Config.Bind<float>("General", "Out of Bounds Damage Multiplier", 1f, "Affects damage from falling off the map.");
			FallThreshold = Config.Bind<float>("General", "Fall Damage Threshold", 0f, "Portion of HP that fall damage can't go below. default is 0 for 1HP. set to 1 to disable fall damage.");
			OOBThreshold = Config.Bind<float>("General", "Out of Bounds Damage Threshold", 0.3f, "Portion of HP that falling off the map can't deal below. Default is just enough to not pop potion/stealthkit/gloop/break low health stuff.");
			FallIFrames = Config.Bind<float>("General", "Fall Damage Invulnerability Seconds", 0.1f, "Amount of time invulnerable since fall damage. default is default OSP.");
			OOBIFrames = Config.Bind<float>("General", "Out of Bounds Damage Invulnerability Seconds", 0.5f, "Amount of time invulnerable since tp back. default is commonly modded OSP.");
			CritFall = Config.Bind<float>("General", "Critical Fall Chance", 0f, "The Cracked In Me Awakens...");
			object obj2 = <>c.<>9__16_0;
			if (obj2 == null)
			{
				hook_OnTeleport val = delegate(orig_OnTeleport orig, GameObject obj, Vector3 pos, Vector3 vel)
				{
					//IL_0003: Unknown result type (might be due to invalid IL or missing references)
					//IL_0004: Unknown result type (might be due to invalid IL or missing references)
					//IL_000c: Unknown result type (might be due to invalid IL or missing references)
					orig.Invoke(obj, pos, vel);
					if (!(vel.y <= 0f))
					{
						CharacterBody component = obj.GetComponent<CharacterBody>();
						if (!oob.Contains(component))
						{
							oob.Add(component);
						}
					}
				};
				<>c.<>9__16_0 = val;
				obj2 = (object)val;
			}
			TeleportHelper.OnTeleport += (hook_OnTeleport)obj2;
			object obj3 = <>c.<>9__16_1;
			if (obj3 == null)
			{
				Manipulator val2 = delegate(ILContext il)
				{
					//IL_0002: Unknown result type (might be due to invalid IL or missing references)
					//IL_0008: Expected O, but got Unknown
					//IL_0038: Unknown result type (might be due to invalid IL or missing references)
					ILCursor val4 = new ILCursor(il);
					val4.GotoNext(new Func<Instruction, bool>[1]
					{
						(Instruction x) => ILPatternMatchingExt.MatchStloc(x, 4)
					});
					val4.Emit(OpCodes.Ldarg_1);
					val4.EmitDelegate<Func<float, CharacterBody, float>>((Func<float, CharacterBody, float>)delegate(float orig, CharacterBody self)
					{
						orig *= FallMultiplier.Value;
						if (oob.Contains(self))
						{
							orig *= OOBMultiplier.Value;
						}
						float num = MathF.Max(self.healthComponent.health - orig * self.maxHealth / 60f, FallThreshold.Value * self.maxHealth);
						if (oob.Contains(self))
						{
							num = MathF.Max(num, OOBThreshold.Value * self.maxHealth);
						}
						return inverseHP(num, self);
					});
					val4.GotoNext(new Func<Instruction, bool>[1]
					{
						(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<HealthComponent>(x, "TakeDamage")
					});
					val4.EmitDelegate<Func<DamageInfo, DamageInfo>>((Func<DamageInfo, DamageInfo>)delegate(DamageInfo info)
					{
						//IL_003a: Unknown result type (might be due to invalid IL or missing references)
						//IL_0041: 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)
						//IL_004b: Unknown result type (might be due to invalid IL or missing references)
						//IL_0052: Unknown result type (might be due to invalid IL or missing references)
						//IL_005c: 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)
						//IL_0066: Unknown result type (might be due to invalid IL or missing references)
						bool flag = Run.instance.runRNG.RangeFloat(0f, 1f) < CritFall.Value;
						if (FallIsLethal.Value || flag)
						{
							info.damageType &= DamageTypeCombo.op_Implicit((DamageType)(-2));
							info.damageType |= DamageTypeCombo.op_Implicit((DamageType)262144);
						}
						if (flag)
						{
							info.crit = true;
						}
						return info;
					});
				};
				<>c.<>9__16_1 = val2;
				obj3 = (object)val2;
			}
			GlobalEventManager.OnCharacterHitGroundServer += (Manipulator)obj3;
			object obj4 = <>c.<>9__16_2;
			if (obj4 == null)
			{
				hook_OnCharacterHitGroundServer val3 = delegate(orig_OnCharacterHitGroundServer orig, GlobalEventManager self, CharacterBody body, HitGroundInfo vel)
				{
					//IL_0004: Unknown result type (might be due to invalid IL or missing references)
					orig.Invoke(self, body, vel);
					body.healthComponent.ospTimer = (oob.Contains(body) ? OOBIFrames.Value : FallIFrames.Value);
					oob.Remove(body);
				};
				<>c.<>9__16_2 = val3;
				obj4 = (object)val3;
			}
			GlobalEventManager.OnCharacterHitGroundServer += (hook_OnCharacterHitGroundServer)obj4;
			static float inverseHP(float orig, CharacterBody self)
			{
				return (self.healthComponent.health - orig) * 60f / self.maxHealth;
			}
		}

		[CompilerGenerated]
		internal static float <Awake>g__inverseHP|16_7(float orig, CharacterBody self)
		{
			return (self.healthComponent.health - orig) * 60f / self.maxHealth;
		}
	}
}