Decompiled source of MonsterFallDamage v1.0.1

plugins/MonsterFallDamagePlugin/MonsterFallDamagePlugin.dll

Decompiled 2 days ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("MonsterFallDamagePlugin")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("MonsterFallDamagePlugin")]
[assembly: AssemblyTitle("MonsterFallDamagePlugin")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace MonsterFallDamagePlugin;

[BepInPlugin("com.mods.monsterfallDamage", "MonsterFallDamage", "1.0.1")]
[BepInProcess("valheim.exe")]
public class Plugin : BaseUnityPlugin
{
	public const string GUID = "com.mods.monsterfallDamage";

	public const string NAME = "MonsterFallDamage";

	public const string VERSION = "1.0.1";

	private readonly Harmony _harmony = new Harmony("com.mods.monsterfallDamage");

	internal static ConfigEntry<float> MinFallHeight;

	internal static ConfigEntry<float> DamageDistance;

	internal static ConfigEntry<float> DamagePerUnit;

	internal static ConfigEntry<float> MaxDamage;

	private void Awake()
	{
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Expected O, but got Unknown
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Expected O, but got Unknown
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b2: Expected O, but got Unknown
		//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ef: Expected O, but got Unknown
		MinFallHeight = ((BaseUnityPlugin)this).Config.Bind<float>("Fall Damage", "Min Fall Height (m)", 4f, new ConfigDescription("Falls below this height deal no damage. (Player default: 4)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 20f), Array.Empty<object>()));
		DamageDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Fall Damage", "Damage Interval (m)", 16f, new ConfigDescription("Damage is added for every X meters fallen above the minimum height. (Player default: 16)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.5f, 100f), Array.Empty<object>()));
		DamagePerUnit = ((BaseUnityPlugin)this).Config.Bind<float>("Fall Damage", "Damage Per Interval", 100f, new ConfigDescription("Damage dealt per interval distance. (Player default: 100)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 100f), Array.Empty<object>()));
		MaxDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Fall Damage", "Max Damage (0 = unlimited)", 100f, new ConfigDescription("Maximum fall damage cap. Set to 0 for no limit. (Player default: 100)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 99999f), Array.Empty<object>()));
		_harmony.PatchAll();
		((BaseUnityPlugin)this).Logger.LogInfo((object)"MonsterFallDamage 1.0.1 loaded.");
	}

	private void OnDestroy()
	{
		_harmony.UnpatchSelf();
	}
}
[HarmonyPatch(typeof(Character), "UpdateGroundContact")]
public static class Patch_MonsterFallDamage
{
	private static readonly FieldInfo f_groundContact = AccessTools.Field(typeof(Character), "m_groundContact");

	private static readonly FieldInfo f_maxAirAltitude = AccessTools.Field(typeof(Character), "m_maxAirAltitude");

	private static readonly FieldInfo f_groundContactPoint = AccessTools.Field(typeof(Character), "m_groundContactPoint");

	private static readonly FieldInfo f_groundContactNormal = AccessTools.Field(typeof(Character), "m_groundContactNormal");

	public static void Prefix(Character __instance)
	{
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: 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)
		//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: Expected O, but got Unknown
		//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00df: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
		if (__instance.IsPlayer() || __instance.IsDead() || !(bool)f_groundContact.GetValue(__instance))
		{
			return;
		}
		float num = (float)f_maxAirAltitude.GetValue(__instance);
		float num2 = Mathf.Max(0f, num - ((Component)__instance).transform.position.y);
		float value = Plugin.MinFallHeight.Value;
		if (!(num2 <= value))
		{
			float num3 = (num2 - value) / Plugin.DamageDistance.Value * Plugin.DamagePerUnit.Value;
			float value2 = Plugin.MaxDamage.Value;
			if (value2 > 0f)
			{
				num3 = Mathf.Min(num3, value2);
			}
			if (!(num3 <= 0f))
			{
				Vector3 point = (Vector3)f_groundContactPoint.GetValue(__instance);
				Vector3 dir = (Vector3)f_groundContactNormal.GetValue(__instance);
				HitData val = new HitData();
				val.m_damage.m_damage = num3;
				val.m_point = point;
				val.m_dir = dir;
				val.m_hitType = (HitType)3;
				__instance.Damage(val);
			}
		}
	}
}