Decompiled source of NoNaturalRegeneration v1.2.0

NoNaturalRegeneration.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using GameNetcodeStuff;
using HarmonyLib;
using Unity.Collections;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("NoNaturalRegeneration")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NoNaturalRegeneration")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("c959da97-7d2d-475f-8238-c5777767c660")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace NoNaturalRegeneration;

public class CriticalInjuryTrigger : MonoBehaviour
{
	[CompilerGenerated]
	private sealed class <SetupTriggerDelayed>d__5 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public CriticalInjuryTrigger <>4__this;

		private BoxCollider <col>5__1;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <SetupTriggerDelayed>d__5(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<col>5__1 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Expected O, but got Unknown
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: Expected O, but got Unknown
			//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0203: Expected O, but got Unknown
			//IL_020e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0218: Expected O, but got Unknown
			//IL_0223: Unknown result type (might be due to invalid IL or missing references)
			//IL_022d: Expected O, but got Unknown
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_0242: Expected O, but got Unknown
			//IL_024d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>2__current = null;
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				<>4__this.triggerObject = new GameObject("HealTrigger_" + <>4__this.playerController.playerUsername);
				<>4__this.triggerObject.layer = 9;
				<>4__this.triggerObject.tag = "InteractTrigger";
				<col>5__1 = <>4__this.triggerObject.AddComponent<BoxCollider>();
				((Collider)<col>5__1).isTrigger = true;
				<col>5__1.size = new Vector3(1f, 1.5f, 1f);
				<>4__this.interactTrigger = <>4__this.triggerObject.AddComponent<InteractTrigger>();
				<>4__this.interactTrigger.hoverTip = "Heal : [LMB]";
				<>4__this.interactTrigger.disabledHoverTip = "Cannot heal";
				<>4__this.interactTrigger.holdTip = "Stabilizing...";
				<>4__this.interactTrigger.interactable = false;
				<>4__this.interactTrigger.oneHandedItemAllowed = true;
				<>4__this.interactTrigger.twoHandedItemAllowed = false;
				<>4__this.interactTrigger.holdInteraction = true;
				<>4__this.interactTrigger.timeToHold = 5f;
				<>4__this.interactTrigger.interactCooldown = true;
				<>4__this.interactTrigger.cooldownTime = 0.5f;
				<>4__this.interactTrigger.disableTriggerMesh = true;
				<>4__this.interactTrigger.triggerOnce = false;
				<>4__this.interactTrigger.touchTrigger = false;
				<>4__this.interactTrigger.onInteract = new InteractEvent();
				<>4__this.interactTrigger.onInteractEarly = new InteractEvent();
				<>4__this.interactTrigger.onStopInteract = new InteractEvent();
				<>4__this.interactTrigger.onCancelAnimation = new InteractEvent();
				<>4__this.interactTrigger.holdingInteractEvent = new InteractEventFloat();
				<>4__this.interactTrigger.onInteractEarlyOtherClients = new InteractEvent();
				((UnityEvent<PlayerControllerB>)(object)<>4__this.interactTrigger.onInteract).AddListener((UnityAction<PlayerControllerB>)delegate
				{
					<>4__this.OnInteractTriggered();
				});
				<>4__this.triggerObject.SetActive(false);
				return false;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	private PlayerControllerB playerController;

	private InteractTrigger interactTrigger;

	private GameObject triggerObject;

	private const int CRITICAL_HEALTH_THRESHOLD = 20;

	private void Start()
	{
		playerController = ((Component)this).GetComponent<PlayerControllerB>();
		((MonoBehaviour)this).StartCoroutine(SetupTriggerDelayed());
	}

	[IteratorStateMachine(typeof(<SetupTriggerDelayed>d__5))]
	private IEnumerator SetupTriggerDelayed()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <SetupTriggerDelayed>d__5(0)
		{
			<>4__this = this
		};
	}

	private void Update()
	{
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)playerController == (Object)null) && !((Object)(object)triggerObject == (Object)null))
		{
			triggerObject.transform.position = ((Component)playerController).transform.position + new Vector3(0f, 1.7f, 0f);
			bool flag = playerController.health < 20 && playerController.health > 0 && !((NetworkBehaviour)playerController).IsOwner && !playerController.isPlayerDead;
			if (interactTrigger.interactable != flag)
			{
				interactTrigger.interactable = flag;
				triggerObject.SetActive(flag);
			}
		}
	}

	private void OnDestroy()
	{
		if ((Object)(object)triggerObject != (Object)null)
		{
			Object.Destroy((Object)(object)triggerObject);
		}
	}

	public void OnInteractTriggered()
	{
		HealNetworkHandler.SendHealRequest(playerController.playerClientId);
	}
}
public static class HealNetworkHandler
{
	public static void SendHealRequest(ulong targetClientId)
	{
		//IL_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		if (!NetworkManager.Singleton.IsClient)
		{
			return;
		}
		FastBufferWriter val = default(FastBufferWriter);
		((FastBufferWriter)(ref val))..ctor(8, (Allocator)2, -1);
		try
		{
			((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref targetClientId, default(ForPrimitives));
			NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("NoNatRegen_Heal", 0uL, val, (NetworkDelivery)3);
		}
		finally
		{
			((IDisposable)(FastBufferWriter)(ref val)).Dispose();
		}
	}

	public static void ReceiveHealRequestOnServer(ulong senderClientId, FastBufferReader reader)
	{
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost)
		{
			return;
		}
		ulong num = default(ulong);
		((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num, default(ForPrimitives));
		PlayerControllerB val = null;
		PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
		foreach (PlayerControllerB val2 in allPlayerScripts)
		{
			if (val2.playerClientId == num)
			{
				val = val2;
				break;
			}
		}
		if ((Object)(object)val == (Object)null)
		{
			return;
		}
		FastBufferWriter val3 = default(FastBufferWriter);
		((FastBufferWriter)(ref val3))..ctor(0, (Allocator)2, -1);
		try
		{
			NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("NoNatRegen_SelfHeal", val.actualClientId, val3, (NetworkDelivery)3);
		}
		finally
		{
			((IDisposable)(FastBufferWriter)(ref val3)).Dispose();
		}
	}

	public static void ReceiveSelfHealCommand(ulong senderClientId, FastBufferReader reader)
	{
		PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
		if (!((Object)(object)localPlayerController == (Object)null) && ((NetworkBehaviour)localPlayerController).IsOwner)
		{
			localPlayerController.health = 20;
			localPlayerController.criticallyInjured = false;
			localPlayerController.bleedingHeavily = false;
			if ((Object)(object)localPlayerController.playerBodyAnimator != (Object)null)
			{
				localPlayerController.playerBodyAnimator.SetBool("Limp", false);
			}
			localPlayerController.MakeCriticallyInjured(false);
			if ((Object)(object)HUDManager.Instance != (Object)null)
			{
				HUDManager.Instance.UpdateHealthUI(localPlayerController.health, false);
				HUDManager.Instance.gasHelmetAnimator.SetBool("gasLeaking", false);
			}
		}
	}
}
public class LowHpEffect : MonoBehaviour
{
	private PlayerControllerB playerController;

	private Volume localVolume;

	private VolumeProfile localProfile;

	private ColorAdjustments colorAdjustments;

	private const int LOW_HEALTH_THRESHOLD = 5;

	private void Start()
	{
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Expected O, but got Unknown
		playerController = ((Component)this).GetComponent<PlayerControllerB>();
		GameObject val = new GameObject("LowHpGrayScaleVolume");
		val.transform.SetParent(((Component)this).transform);
		localVolume = val.AddComponent<Volume>();
		localVolume.isGlobal = true;
		localVolume.priority = 1000f;
		localVolume.weight = 0f;
		localProfile = ScriptableObject.CreateInstance<VolumeProfile>();
		localVolume.profile = localProfile;
		if (!localProfile.TryGet<ColorAdjustments>(ref colorAdjustments))
		{
			colorAdjustments = localProfile.Add<ColorAdjustments>(true);
		}
		((VolumeParameter)colorAdjustments.saturation).overrideState = true;
		((VolumeParameter<float>)(object)colorAdjustments.saturation).value = -100f;
	}

	private void Update()
	{
		if (!((Object)(object)playerController == (Object)null) && !((Object)(object)localVolume == (Object)null))
		{
			if (!((NetworkBehaviour)playerController).IsOwner || playerController.isPlayerDead || ((Object)(object)GameNetworkManager.Instance.localPlayerController != (Object)null && (Object)(object)playerController != (Object)(object)GameNetworkManager.Instance.localPlayerController))
			{
				localVolume.weight = 0f;
			}
			else if (playerController.health <= 5 && playerController.health > 0)
			{
				localVolume.weight = Mathf.Lerp(localVolume.weight, 1f, Time.deltaTime * 5f);
			}
			else
			{
				localVolume.weight = Mathf.Lerp(localVolume.weight, 0f, Time.deltaTime * 5f);
			}
		}
	}

	private void OnDestroy()
	{
		if ((Object)(object)localVolume != (Object)null)
		{
			Object.Destroy((Object)(object)((Component)localVolume).gameObject);
		}
		if ((Object)(object)localProfile != (Object)null)
		{
			Object.Destroy((Object)(object)localProfile);
		}
	}
}
[HarmonyPatch(typeof(PlayerControllerB))]
internal class LowHpEffectPatch
{
	[HarmonyPatch("Start")]
	[HarmonyPostfix]
	private static void AddLowHpEffect(PlayerControllerB __instance)
	{
		if ((Object)(object)((Component)__instance).gameObject.GetComponent<LowHpEffect>() == (Object)null)
		{
			((Component)__instance).gameObject.AddComponent<LowHpEffect>();
		}
	}
}
[BepInPlugin("NoNaturalRegeneration", "No Natural Regeneration", "1.1.1")]
public class Plugin : BaseUnityPlugin
{
	private void Awake()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Expected O, but got Unknown
		Harmony val = new Harmony("NoNaturalRegeneration");
		val.PatchAll();
		((BaseUnityPlugin)this).Logger.LogInfo((object)"No Natural Regeneration is loaded!");
	}
}
[HarmonyPatch(typeof(PlayerControllerB))]
internal class PlayerControllerPatch
{
	[HarmonyPatch("Start")]
	[HarmonyPostfix]
	private static void AddHealTrigger(PlayerControllerB __instance)
	{
		if ((Object)(object)((Component)__instance).gameObject.GetComponent<CriticalInjuryTrigger>() == (Object)null)
		{
			((Component)__instance).gameObject.AddComponent<CriticalInjuryTrigger>();
		}
	}
}
[HarmonyPatch(typeof(StartOfRound))]
internal class NetworkMessagePatch
{
	[HarmonyPatch("Start")]
	[HarmonyPostfix]
	private static void RegisterMessages()
	{
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Expected O, but got Unknown
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0064: Expected O, but got Unknown
		if ((Object)(object)NetworkManager.Singleton != (Object)null && NetworkManager.Singleton.CustomMessagingManager != null)
		{
			NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("NoNatRegen_Heal", new HandleNamedMessageDelegate(HealNetworkHandler.ReceiveHealRequestOnServer));
			NetworkManager.Singleton.CustomMessagingManager.RegisterNamedMessageHandler("NoNatRegen_SelfHeal", new HandleNamedMessageDelegate(HealNetworkHandler.ReceiveSelfHealCommand));
		}
	}
}
[HarmonyPatch(typeof(PlayerControllerB))]
public class LowHpDeathTimer
{
	private class TimerData
	{
		public float deathTimer = -1f;
	}

	private static readonly ConditionalWeakTable<PlayerControllerB, TimerData> timers = new ConditionalWeakTable<PlayerControllerB, TimerData>();

	[HarmonyPatch("Update")]
	[HarmonyPostfix]
	private static void CheckLowHpTimer(PlayerControllerB __instance)
	{
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
		if (!((NetworkBehaviour)__instance).IsOwner || __instance.isPlayerDead)
		{
			return;
		}
		timers.TryGetValue(__instance, out var value);
		if (value == null)
		{
			value = new TimerData();
			timers.Add(__instance, value);
		}
		if (__instance.health <= 5 && __instance.health > 0)
		{
			if (value.deathTimer < 0f)
			{
				value.deathTimer = 60f;
				ShowWarningNotification();
			}
			if (value.deathTimer > 0f)
			{
				value.deathTimer -= Time.deltaTime;
				if (value.deathTimer <= 0f)
				{
					__instance.DamagePlayer(5, true, true, (CauseOfDeath)0, 0, false, default(Vector3));
					value.deathTimer = -1f;
				}
			}
		}
		else
		{
			value.deathTimer = -1f;
		}
	}

	private static void ShowWarningNotification()
	{
		if ((Object)(object)HUDManager.Instance != (Object)null)
		{
			HUDManager.Instance.DisplayTip("WARNING!", "Your injury is fatal. Seek immediate medical attention or perish.", true, false, "warning");
		}
	}
}
[HarmonyPatch(typeof(PlayerControllerB))]
public class TimerManipulator
{
	[HarmonyPatch("Update")]
	[HarmonyPostfix]
	private static void ManipulateRegenTimer(PlayerControllerB __instance)
	{
		if (((NetworkBehaviour)__instance).IsOwner && !__instance.isPlayerDead && __instance.health < 20 && __instance.health > 0 && __instance.healthRegenerateTimer <= 1f)
		{
			__instance.healthRegenerateTimer = 1.1f;
		}
	}
}