Decompiled source of 556x30MINSAS Ammo v1.0.1

556x30MINSAS_Ammo.dll

Decompiled a month ago
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using FistVR;
using HarmonyLib;
using OtherLoader;
using UnityEngine;

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
internal class Mauser0608Controller : MonoBehaviour
{
	public FVRFireArm weapon;

	public float slideForwardShiftOnMagEject = 0.004f;

	public bool debug;

	public Transform manualReleaseTriggerPoint;

	public float triggerRadius = 0.03f;

	private Handgun hg;

	private FVRFireArmMagazine lastFrameMag;

	private float originalSlideZLock;

	private FieldInfo slideZLockField;

	private FieldInfo slideSpeedField;

	private bool initialized;

	private void Start()
	{
		TryInitialize();
	}

	private void Update()
	{
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d7: Invalid comparison between Unknown and I4
		//IL_0220: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
		if (!initialized)
		{
			TryInitialize();
		}
		else
		{
			if ((Object)(object)hg == (Object)null)
			{
				return;
			}
			FVRFireArmMagazine magazine = ((FVRFireArm)hg).Magazine;
			if ((Object)(object)magazine != (Object)(object)lastFrameMag)
			{
				if ((Object)(object)magazine != (Object)null && (Object)(object)lastFrameMag == (Object)null)
				{
					OnMagazineInserted();
				}
				else if ((Object)(object)magazine == (Object)null && (Object)(object)lastFrameMag != (Object)null)
				{
					OnMagazineEjected();
				}
				lastFrameMag = magazine;
			}
			if (!((Object)(object)magazine == (Object)null) || !((Object)(object)hg.Slide != (Object)null))
			{
				return;
			}
			if ((int)hg.Slide.CurPos == 4 && !hg.IsSlideLockUp)
			{
				if (debug)
				{
					Debug.Log((object)"Mauser0608Controller: Slide racked to rear without a magazine. Locking open.");
				}
				hg.EngageSlideRelease();
			}
			if (((FVRInteractiveObject)hg.Slide).IsHeld && (Object)(object)((FVRInteractiveObject)hg.Slide).m_hand != (Object)null)
			{
				FVRViveHand hand = ((FVRInteractiveObject)hg.Slide).m_hand;
				bool flag = false;
				if (hand.IsInStreamlinedMode)
				{
					if (hand.Input.BYButtonDown || hand.Input.AXButtonDown)
					{
						flag = true;
					}
				}
				else if (hand.Input.TouchpadDown && Vector2.Angle(hand.Input.TouchpadAxes, Vector2.down) <= 45f)
				{
					flag = true;
				}
				if (flag && hg.IsSlideLockUp)
				{
					if (debug)
					{
						Debug.Log((object)"Mauser0608Controller: Manual slide release override triggered via hand input.");
					}
					hg.DropSlideRelease();
				}
			}
			if (!((Object)(object)manualReleaseTriggerPoint != (Object)null) || !hg.IsSlideLockUp)
			{
				return;
			}
			Collider[] array = Physics.OverlapSphere(manualReleaseTriggerPoint.position, triggerRadius);
			for (int i = 0; i < array.Length; i++)
			{
				FVRViveHand componentInParent = ((Component)array[i]).GetComponentInParent<FVRViveHand>();
				if ((Object)(object)componentInParent != (Object)null && (Object)(object)componentInParent != (Object)(object)((FVRInteractiveObject)hg).m_hand && ((Object)(object)hg.Slide == (Object)null || (Object)(object)componentInParent != (Object)(object)((FVRInteractiveObject)hg.Slide).m_hand))
				{
					if (debug)
					{
						Debug.Log((object)"Mauser0608Controller: Hand detected near trigger point. Releasing slide.");
					}
					hg.DropSlideRelease();
					break;
				}
			}
		}
	}

	private void TryInitialize()
	{
		if (!((Object)(object)weapon != (Object)null) || !(weapon is Handgun))
		{
			return;
		}
		ref Handgun reference = ref hg;
		FVRFireArm obj = weapon;
		reference = (Handgun)(object)((obj is Handgun) ? obj : null);
		lastFrameMag = ((FVRFireArm)hg).Magazine;
		slideZLockField = typeof(HandgunSlide).GetField("m_slideZ_lock", BindingFlags.Instance | BindingFlags.NonPublic);
		slideSpeedField = typeof(HandgunSlide).GetField("m_curSlideSpeed", BindingFlags.Instance | BindingFlags.NonPublic);
		if ((Object)(object)hg.Slide != (Object)null && (object)slideZLockField != null)
		{
			originalSlideZLock = (float)slideZLockField.GetValue(hg.Slide);
			initialized = true;
			if ((Object)(object)lastFrameMag == (Object)null)
			{
				float num = originalSlideZLock + slideForwardShiftOnMagEject;
				slideZLockField.SetValue(hg.Slide, num);
			}
			if (debug)
			{
				Debug.Log((object)("Mauser0608Controller: Initialized. Original Z lock is " + originalSlideZLock));
			}
		}
	}

	private void OnMagazineInserted()
	{
		if (debug)
		{
			Debug.Log((object)"Mauser0608Controller: Magazine inserted.");
		}
		ResetSlideLock();
		if (hg.IsSlideLockUp)
		{
			if (debug)
			{
				Debug.Log((object)"Mauser0608Controller: Slide is locked. Dropping slide release.");
			}
			hg.DropSlideRelease();
		}
	}

	private void OnMagazineEjected()
	{
		if (debug)
		{
			Debug.Log((object)"Mauser0608Controller: Magazine ejected.");
		}
		if (hg.IsSlideLockUp && (object)slideZLockField != null)
		{
			float num = originalSlideZLock + slideForwardShiftOnMagEject;
			if (debug)
			{
				Debug.Log((object)("Mauser0608Controller: Shifting slide lock to " + num));
			}
			slideZLockField.SetValue(hg.Slide, num);
			if ((object)slideSpeedField != null)
			{
				slideSpeedField.SetValue(hg.Slide, hg.Slide.Speed_Forward);
			}
		}
	}

	private void ResetSlideLock()
	{
		if ((Object)(object)hg.Slide != (Object)null && (object)slideZLockField != null)
		{
			if (debug)
			{
				Debug.Log((object)("Mauser0608Controller: Resetting slide lock to " + originalSlideZLock));
			}
			slideZLockField.SetValue(hg.Slide, originalSlideZLock);
		}
	}
}
namespace Volks.556x30MINSAS_Ammo;

[BepInPlugin("Volks.556x30MINSAS_Ammo", "556x30MINSAS_Ammo", "1.0.1")]
[BepInProcess("h3vr.exe")]
[Description("Built with MeatKit")]
[BepInDependency("h3vr.otherloader", "1.3.0")]
public class 556x30MINSAS_AmmoPlugin : BaseUnityPlugin
{
	private static readonly string BasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

	internal static ManualLogSource Logger;

	private void Awake()
	{
		Logger = ((BaseUnityPlugin)this).Logger;
		LoadAssets();
	}

	private void LoadAssets()
	{
		Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "Volks.556x30MINSAS_Ammo");
		OtherLoader.RegisterDirectLoad(BasePath, "Volks.556x30MINSAS_Ammo", "", "", "556x30minsas_ammo", "");
	}
}