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", "");
}
}