using System; using System.Collections.Generic; 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 HarshRecoilController : MonoBehaviour { public FVRFireArm weapon; public float disarmChance = 1f; public float recoilForceUp = 4f; public float recoilForceBack = 6f; public float recoilTorque = 12f; public float recoilRandomness = 1.5f; public bool debug; private List lastFrameSpent = new List(); private List disabledColliders = new List(); private float colliderRestoreTimer; private bool initialized; private void Start() { TryInitialize(); } private void Update() { //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0214: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0237: Unknown result type (might be due to invalid IL or missing references) //IL_023c: Unknown result type (might be due to invalid IL or missing references) //IL_023e: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_025c: Unknown result type (might be due to invalid IL or missing references) if (!initialized) { TryInitialize(); } else { if ((Object)(object)weapon == (Object)null || weapon.FChambers == null) { return; } if (colliderRestoreTimer > 0f) { colliderRestoreTimer -= Time.deltaTime; if (colliderRestoreTimer <= 0f) { RestoreColliders(); } } for (int i = 0; i < weapon.FChambers.Count; i++) { FVRFireArmChamber val = weapon.FChambers[i]; if ((Object)(object)val == (Object)null) { continue; } if (i >= lastFrameSpent.Count) { lastFrameSpent.Add(val.IsSpent); } bool isSpent = val.IsSpent; bool flag = isSpent && !lastFrameSpent[i]; lastFrameSpent[i] = isSpent; if (!flag) { continue; } bool flag2 = weapon.IsTwoHandStabilized() || (Object)(object)((FVRPhysicalObject)weapon).AltGrip != (Object)null; if (((FVRInteractiveObject)weapon).IsHeld && !flag2 && Random.value <= disarmChance) { if (debug) { Debug.Log((object)"HarshRecoilController: Weapon fired one-handed. Applying recoil physics and disarming."); } FVRViveHand hand = ((FVRInteractiveObject)weapon).m_hand; if ((Object)(object)hand != (Object)null) { hand.Buzz(hand.Buzzer.Buzz_BeginInteraction); } ((FVRInteractiveObject)weapon).ForceBreakInteraction(); DisableColliders(); Rigidbody rootRigidbody = ((FVRPhysicalObject)weapon).RootRigidbody; if ((Object)(object)rootRigidbody != (Object)null) { Vector3 val2 = -((Component)weapon).transform.forward * recoilForceBack + ((Component)weapon).transform.up * recoilForceUp; Vector3 val3 = Random.insideUnitSphere * recoilRandomness; rootRigidbody.AddForce(val2 + val3, (ForceMode)2); Vector3 val4 = ((Component)weapon).transform.right * recoilTorque; Vector3 val5 = Random.insideUnitSphere * (recoilRandomness * 3f); rootRigidbody.AddTorque(val4 + val5, (ForceMode)2); } } } } } private void DisableColliders() { disabledColliders.Clear(); Collider[] componentsInChildren = ((Component)weapon).GetComponentsInChildren(); foreach (Collider val in componentsInChildren) { if ((Object)(object)val != (Object)null && val.enabled) { val.enabled = false; disabledColliders.Add(val); } } colliderRestoreTimer = 0.25f; } private void RestoreColliders() { for (int i = 0; i < disabledColliders.Count; i++) { if ((Object)(object)disabledColliders[i] != (Object)null) { disabledColliders[i].enabled = true; } } disabledColliders.Clear(); } private void TryInitialize() { if ((Object)(object)weapon == (Object)null) { weapon = ((Component)this).GetComponent(); } if (!((Object)(object)weapon != (Object)null) || weapon.FChambers == null) { return; } lastFrameSpent.Clear(); for (int i = 0; i < weapon.FChambers.Count; i++) { if ((Object)(object)weapon.FChambers[i] != (Object)null) { lastFrameSpent.Add(weapon.FChambers[i].IsSpent); } else { lastFrameSpent.Add(item: false); } } initialized = true; } } internal class ManualChamberLoad : FVRInteractiveObject { public FVRFireArmChamber chamber; public Transform ChamberSeatedPoint; public Collider vanillaChamberCollider; public float loadThreshold = -0.005f; public float extractThreshold = -0.05f; public float maxCasingPushDistance = 0.025f; public float shuckForceThreshold = 1.5f; public float spentShuckResistance = 6f; public float shuckSensitivity = 1.2f; public AudioEvent AudEvent_ShellInStart; public AudioEvent AudEvent_ShellIn; public AudioEvent AudEvent_ShellOutStart; public AudioEvent AudEvent_ShellOut; public bool debug; private FVRFireArmRound m_loadingRound; private float m_roundHandOffsetZ; private bool m_isExtracting; private float m_gravitySlideZ; public override void Awake() { ((FVRInteractiveObject)this).Awake(); if ((Object)(object)chamber == (Object)null) { chamber = ((Component)this).GetComponent(); } if ((Object)(object)vanillaChamberCollider != (Object)null) { vanillaChamberCollider.enabled = false; if (debug) { Debug.Log((object)"ManualChamberLoad: Disabled specified vanilla chamber collider."); } } } private void Update() { //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_022f: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_033a: Unknown result type (might be due to invalid IL or missing references) //IL_033f: Unknown result type (might be due to invalid IL or missing references) //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_03c4: Unknown result type (might be due to invalid IL or missing references) //IL_03c9: Unknown result type (might be due to invalid IL or missing references) //IL_03ce: Unknown result type (might be due to invalid IL or missing references) //IL_0473: Unknown result type (might be due to invalid IL or missing references) //IL_047e: Unknown result type (might be due to invalid IL or missing references) //IL_0483: Unknown result type (might be due to invalid IL or missing references) //IL_048d: Unknown result type (might be due to invalid IL or missing references) //IL_0492: Unknown result type (might be due to invalid IL or missing references) //IL_056b: Unknown result type (might be due to invalid IL or missing references) //IL_04f6: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)chamber == (Object)null || (Object)(object)ChamberSeatedPoint == (Object)null) { return; } if ((Object)(object)m_loadingRound != (Object)null) { FVRViveHand hand = ((FVRInteractiveObject)m_loadingRound).m_hand; if ((Object)(object)hand == (Object)null || !((FVRInteractiveObject)m_loadingRound).IsHeld) { m_loadingRound = null; return; } float num = ChamberSeatedPoint.InverseTransformPoint(((Component)hand).transform.position).z + m_roundHandOffsetZ; if (num >= loadThreshold) { PlaySound(AudEvent_ShellIn); ((FVRInteractiveObject)m_loadingRound).ForceBreakInteraction(); chamber.SetRound(m_loadingRound, false); Object.Destroy((Object)(object)((Component)m_loadingRound).gameObject); m_loadingRound = null; if (debug) { Debug.Log((object)"ManualChamberLoad: Round successfully seated."); } } else if (num < extractThreshold * 1.5f) { m_loadingRound = null; if (debug) { Debug.Log((object)"ManualChamberLoad: Loading aborted."); } } else { ((Component)m_loadingRound).transform.position = ChamberSeatedPoint.TransformPoint(new Vector3(0f, 0f, num)); ((Component)m_loadingRound).transform.rotation = ChamberSeatedPoint.rotation; } } if (m_isExtracting) { if (!((FVRInteractiveObject)this).IsHeld || (Object)(object)base.m_hand == (Object)null) { m_isExtracting = false; if ((Object)(object)chamber.ProxyRound != (Object)null) { chamber.ProxyRound.localPosition = Vector3.zero; } return; } float num2 = ChamberSeatedPoint.InverseTransformPoint(((Component)base.m_hand).transform.position).z + m_roundHandOffsetZ; if (num2 <= extractThreshold) { PlaySound(AudEvent_ShellOut); FVRFireArmRound val = chamber.EjectRound(ChamberSeatedPoint.position, Vector3.zero, Vector3.zero, false); if ((Object)(object)val != (Object)null) { ((FVRInteractiveObject)val).BeginInteraction(base.m_hand); base.m_hand.ForceSetInteractable((FVRInteractiveObject)(object)val); } ((FVRInteractiveObject)this).ForceBreakInteraction(); m_isExtracting = false; m_gravitySlideZ = 0f; if (debug) { Debug.Log((object)"ManualChamberLoad: Round successfully extracted."); } } else { float num3 = Mathf.Clamp(num2, extractThreshold, 0f); if ((Object)(object)chamber.ProxyRound != (Object)null) { chamber.ProxyRound.localPosition = new Vector3(0f, 0f, num3); } } } if (!chamber.IsFull || !chamber.IsAccessible || ((FVRInteractiveObject)this).IsHeld || !((Object)(object)m_loadingRound == (Object)null)) { return; } float num4 = Vector3.Angle(((Component)chamber).transform.forward, Vector3.up); float num5 = 0f; if (!chamber.IsSpent && num4 < 70f) { num5 -= Time.deltaTime * 0.2f; } Rigidbody val2 = ((!((Object)(object)chamber.Firearm != (Object)null)) ? null : ((FVRPhysicalObject)chamber.Firearm).RootRigidbody); if ((Object)(object)val2 != (Object)null) { float num6 = 0f - ChamberSeatedPoint.InverseTransformDirection(val2.velocity).z; float num7 = num6 - shuckForceThreshold; if (num7 > 0f) { float num8 = ((!chamber.IsSpent) ? 1f : spentShuckResistance); num5 -= num7 / num8 * Time.deltaTime * shuckSensitivity; } } if (num5 != 0f) { m_gravitySlideZ += num5; if (m_gravitySlideZ <= extractThreshold) { PlaySound(AudEvent_ShellOut); chamber.EjectRound(ChamberSeatedPoint.position, -ChamberSeatedPoint.forward * 0.5f, Random.onUnitSphere, false); m_gravitySlideZ = 0f; if (debug) { Debug.Log((object)"ManualChamberLoad: Round ejected via gravity/shucking."); } } else if ((Object)(object)chamber.ProxyRound != (Object)null) { chamber.ProxyRound.localPosition = new Vector3(0f, 0f, m_gravitySlideZ); } } else if (m_gravitySlideZ < 0f) { m_gravitySlideZ = Mathf.MoveTowards(m_gravitySlideZ, 0f, Time.deltaTime * 0.5f); if ((Object)(object)chamber.ProxyRound != (Object)null) { chamber.ProxyRound.localPosition = new Vector3(0f, 0f, m_gravitySlideZ); } } } private void OnTriggerStay(Collider other) { //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: 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_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)chamber == (Object)null || (Object)(object)ChamberSeatedPoint == (Object)null || !chamber.IsAccessible || chamber.IsFull || (Object)(object)m_loadingRound != (Object)null || m_isExtracting) { return; } FVRFireArmRound componentInParent = ((Component)other).GetComponentInParent(); if (!((Object)(object)componentInParent != (Object)null) || !((FVRInteractiveObject)componentInParent).IsHeld || componentInParent.RoundType != chamber.RoundType) { return; } FVRViveHand hand = ((FVRInteractiveObject)componentInParent).m_hand; if ((Object)(object)hand != (Object)null) { PlaySound(AudEvent_ShellInStart); m_loadingRound = componentInParent; Vector3 val = ChamberSeatedPoint.InverseTransformPoint(((Component)hand).transform.position); m_roundHandOffsetZ = ChamberSeatedPoint.InverseTransformPoint(((Component)m_loadingRound).transform.position).z - val.z; if (debug) { Debug.Log((object)"ManualChamberLoad: Round entered loading zone. Initializing sliding guide."); } } } public override bool IsInteractable() { return (Object)(object)chamber != (Object)null && chamber.IsFull && chamber.IsAccessible; } public override void BeginInteraction(FVRViveHand hand) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) ((FVRInteractiveObject)this).BeginInteraction(hand); if ((Object)(object)chamber != (Object)null && chamber.IsFull && chamber.IsAccessible) { PlaySound(AudEvent_ShellOutStart); m_isExtracting = true; Vector3 val = ChamberSeatedPoint.InverseTransformPoint(((Component)hand).transform.position); float num = 0f; if ((Object)(object)chamber.ProxyRound != (Object)null) { num = chamber.ProxyRound.localPosition.z; } m_roundHandOffsetZ = num - val.z; } } public override void EndInteraction(FVRViveHand hand) { //IL_0042: Unknown result type (might be due to invalid IL or missing references) ((FVRInteractiveObject)this).EndInteraction(hand); m_isExtracting = false; if ((Object)(object)chamber != (Object)null && (Object)(object)chamber.ProxyRound != (Object)null) { chamber.ProxyRound.localPosition = Vector3.zero; } } private void PlaySound(AudioEvent aud) { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) if (aud != null) { if ((Object)(object)chamber != (Object)null && (Object)(object)chamber.Firearm != (Object)null) { chamber.Firearm.PlayAudioAsHandling(aud, ((Component)this).transform.position); } else { SM.PlayCoreSound((FVRPooledAudioType)10, aud, ((Component)this).transform.position); } } } } internal class ManualCylinderIndex : FVRAlternateGrip { public SingleActionRevolver Revolver; public float indexCooldown = 0.2f; public bool debug; private float m_cooldownTimer; public override void Awake() { if ((Object)(object)((FVRInteractiveObject)this).PoseOverride == (Object)null) { ((FVRInteractiveObject)this).PoseOverride = ((Component)this).transform; } ((FVRAlternateGrip)this).Awake(); if ((Object)(object)base.PrimaryObject == (Object)null && (Object)(object)Revolver != (Object)null) { base.PrimaryObject = (FVRPhysicalObject)(object)Revolver; } base.DoesBracing = false; } private void Update() { if ((Object)(object)Revolver == (Object)null) { return; } if (m_cooldownTimer > 0f) { m_cooldownTimer -= Time.deltaTime; } FVRViveHand holdingHand = GetHoldingHand(); if ((Object)(object)holdingHand != (Object)null) { bool flag = false; if (holdingHand.IsInStreamlinedMode) { if (holdingHand.Input.AXButtonDown || holdingHand.Input.BYButtonDown) { flag = true; } } else if (holdingHand.Input.TouchpadDown) { flag = true; } if (flag && m_cooldownTimer <= 0f && Revolver.m_isStateToggled) { if (debug) { Debug.Log((object)"ManualCylinderIndex: Indexing cylinder forward one chamber."); } Revolver.AdvanceCylinder(); m_cooldownTimer = indexCooldown; holdingHand.Buzz(holdingHand.Buzzer.Buzz_BeginInteraction); } } if ((Object)(object)holdingHand != (Object)null) { Revolver.UpdateCylinderRot(); } } public override bool IsInteractable() { return (Object)(object)Revolver != (Object)null && ((FVRAlternateGrip)this).IsInteractable(); } public override void BeginInteraction(FVRViveHand hand) { ((FVRAlternateGrip)this).BeginInteraction(hand); if (debug) { Debug.Log((object)"ManualCylinderIndex: Cylinder grabbed safely via AltGrip."); } } public override void EndInteraction(FVRViveHand hand) { ((FVRAlternateGrip)this).EndInteraction(hand); if (debug) { Debug.Log((object)"ManualCylinderIndex: Cylinder released."); } } private FVRViveHand GetHoldingHand() { if ((Object)(object)((FVRInteractiveObject)this).m_hand != (Object)null) { return ((FVRInteractiveObject)this).m_hand; } if ((Object)(object)Revolver != (Object)null && ((FVRPhysicalObject)Revolver).IsAltHeld) { return ((FVRInteractiveObject)Revolver).m_hand; } return null; } } internal class ManualRevolverEjectorRod : FVRInteractiveObject { public SingleActionRevolver Revolver; public Transform EjectorRod; public Transform Point_Rod_Forward; public Transform Point_Rod_Rearward; public float Speed_Forward = 10f; public float Speed_Held = 20f; public float SpringStiffness = 40f; public float EjectThreshold = 0.9f; public float maxCasingPushDistance = 0.025f; public AudioEvent AudEvent_RodBack; public AudioEvent AudEvent_RodForward; public bool debug; private float m_rodZ; private float m_rodZ_forward; private float m_rodZ_rear; private float m_curSpeed; private bool m_isRearPlayed; private bool m_isForwardPlayed; private bool m_isAutoPushing; private int m_autoPushDir = 1; public override void Awake() { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) ((FVRInteractiveObject)this).Awake(); if ((Object)(object)EjectorRod != (Object)null && (Object)(object)Point_Rod_Forward != (Object)null && (Object)(object)Point_Rod_Rearward != (Object)null) { m_rodZ_forward = Point_Rod_Forward.localPosition.z; m_rodZ_rear = Point_Rod_Rearward.localPosition.z; m_rodZ = m_rodZ_forward; } } private void Update() { //IL_028f: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Unknown result type (might be due to invalid IL or missing references) //IL_02a8: Unknown result type (might be due to invalid IL or missing references) //IL_02b7: Unknown result type (might be due to invalid IL or missing references) //IL_0196: 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_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_0445: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Revolver == (Object)null || (Object)(object)EjectorRod == (Object)null || (Object)(object)EjectorRod.parent == (Object)null) { return; } bool isHeld = ((FVRInteractiveObject)this).IsHeld; float rodZ_forward = m_rodZ_forward; if ((Object)(object)((FVRInteractiveObject)Revolver).m_hand != (Object)null && ((FVRInteractiveObject)Revolver).m_hand.Input.TriggerDown && Revolver.m_isStateToggled && !isHeld) { m_isAutoPushing = true; m_autoPushDir = 1; } if (m_isAutoPushing) { m_curSpeed = 0f; if (m_autoPushDir == 1) { m_rodZ = Mathf.MoveTowards(m_rodZ, m_rodZ_rear, Speed_Held * 2f * Time.deltaTime); if (Mathf.Abs(m_rodZ - m_rodZ_rear) < 0.001f) { m_autoPushDir = -1; } } else { m_rodZ = Mathf.MoveTowards(m_rodZ, m_rodZ_forward, Speed_Forward * 2f * Time.deltaTime); if (Mathf.Abs(m_rodZ - m_rodZ_forward) < 0.001f) { m_isAutoPushing = false; m_autoPushDir = 1; } } } else if (isHeld && (Object)(object)base.m_hand != (Object)null) { Vector3 closestValidPoint = ((FVRInteractiveObject)this).GetClosestValidPoint(Point_Rod_Forward.position, Point_Rod_Rearward.position, ((HandInput)(ref base.m_hand.Input)).Pos); rodZ_forward = EjectorRod.parent.InverseTransformPoint(closestValidPoint).z; m_curSpeed = 0f; m_rodZ = Mathf.MoveTowards(m_rodZ, rodZ_forward, Speed_Held * Time.deltaTime); } else { m_curSpeed = Mathf.MoveTowards(m_curSpeed, Speed_Forward, Time.deltaTime * SpringStiffness); m_rodZ = Mathf.MoveTowards(m_rodZ, rodZ_forward, m_curSpeed * Time.deltaTime); } float num = Mathf.Min(m_rodZ_forward, m_rodZ_rear); float num2 = Mathf.Max(m_rodZ_forward, m_rodZ_rear); m_rodZ = Mathf.Clamp(m_rodZ, num, num2); EjectorRod.localPosition = new Vector3(EjectorRod.localPosition.x, EjectorRod.localPosition.y, m_rodZ); float num3 = Mathf.InverseLerp(m_rodZ_forward, m_rodZ_rear, m_rodZ); if (num3 > EjectThreshold) { if (!m_isRearPlayed) { PlaySound(AudEvent_RodBack); m_isRearPlayed = true; m_isForwardPlayed = false; if (!m_isAutoPushing) { Revolver.EjectPrevCylinder(); } if (debug) { Debug.Log((object)"ManualRevolverEjectorRod: Rod reached threshold. Ejecting."); } } } else if (num3 < 0.1f && !m_isForwardPlayed) { PlaySound(AudEvent_RodForward); m_isForwardPlayed = true; m_isRearPlayed = false; } int num4 = Revolver.PrevChamber; if (Revolver.IsAccessTwoChambersBack) { num4 = Revolver.PrevChamber2; } if ((Object)(object)Revolver.Cylinder != (Object)null && Revolver.Cylinder.Chambers != null && num4 < Revolver.Cylinder.Chambers.Length) { FVRFireArmChamber val = Revolver.Cylinder.Chambers[num4]; if ((Object)(object)val != (Object)null && val.IsFull && (Object)(object)val.ProxyRound != (Object)null) { val.ProxyRound.localPosition = new Vector3(0f, 0f, (0f - num3) * maxCasingPushDistance); } } } public override bool IsInteractable() { return (Object)(object)Revolver != (Object)null && Revolver.m_isStateToggled; } public override void BeginInteraction(FVRViveHand hand) { ((FVRInteractiveObject)this).BeginInteraction(hand); if ((Object)(object)EjectorRod != (Object)null && (Object)(object)Point_Rod_Forward != (Object)null && (Object)(object)EjectorRod.parent != (Object)(object)Point_Rod_Forward.parent) { EjectorRod.SetParent(Point_Rod_Forward.parent); } } private void PlaySound(AudioEvent aud) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) if (aud != null && (Object)(object)Revolver != (Object)null) { ((FVRFireArm)Revolver).PlayAudioAsHandling(aud, ((Component)this).transform.position); } } } public class SingleActionPhysicalEnhancer : MonoBehaviour { public float CartridgeLength = 0.04f; public float CartridgePivotOffset = 0f; public bool DebugMode = false; private SingleActionRevolver _revolver; private List _slidingRounds = new List(); private FVRViveHand _ejectorHand; private FVRViveHand _gateHand; private FVRViveHand _cylinderHand; private float _gateStartLocalY; private bool _hasEjectedThisStroke; private bool _hasIndexedThisPress; private void Awake() { _revolver = ((Component)this).GetComponent(); if (!((Object)(object)_revolver != (Object)null)) { return; } _revolver.StateToggles = false; if (DebugMode) { Debug.Log((object)("SingleActionPhysicalEnhancer: Initialized on revolver " + ((Object)((Component)this).gameObject).name)); } SingleActionEjectorRod componentInChildren = ((Component)this).GetComponentInChildren(); if ((Object)(object)componentInChildren != (Object)null) { Collider component = ((Component)componentInChildren).GetComponent(); if ((Object)(object)component != (Object)null) { component.enabled = false; } } } private void Update() { if (!((Object)(object)_revolver == (Object)null)) { FVRViveHand[] hands = Object.FindObjectsOfType(); UpdateGateInteraction(hands); UpdateEjectorInteraction(hands); UpdateCylinderInteraction(hands); UpdateCartridgeDetection(hands); UpdateSlidingRounds(hands); } } private void OffsetChamber(int offset) { int numChambers = _revolver.Cylinder.NumChambers; int num = (_revolver.CurChamber + offset) % numChambers; if (num < 0) { num += numChambers; } _revolver.CurChamber = num; _revolver.UpdateCylinderRot(); } private bool IsHandHoldingGun(FVRViveHand hand) { if ((Object)(object)hand == (Object)null) { return false; } if ((Object)(object)hand.CurrentInteractable == (Object)(object)_revolver) { return true; } if ((Object)(object)((FVRPhysicalObject)_revolver).AltGrip != (Object)null && (Object)(object)hand.CurrentInteractable == (Object)(object)((FVRPhysicalObject)_revolver).AltGrip) { return true; } return false; } private void UpdateGateInteraction(FVRViveHand[] hands) { //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_gateHand == (Object)null) { foreach (FVRViveHand val in hands) { if (!((Object)(object)val == (Object)null) && !((Object)(object)val.PalmTransform == (Object)null) && !IsHandHoldingGun(val)) { float num = Vector3.Distance(val.PalmTransform.position, _revolver.LoadingGate.position); if (num < 0.04f && val.Input.TriggerPressed) { _gateHand = val; _gateStartLocalY = ((Component)_revolver).transform.InverseTransformPoint(val.PalmTransform.position).y; break; } } } return; } if (!_gateHand.Input.TriggerPressed) { _gateHand = null; return; } float y = ((Component)_revolver).transform.InverseTransformPoint(_gateHand.PalmTransform.position).y; float num2 = y - _gateStartLocalY; if (num2 < -0.02f && !_revolver.m_isStateToggled) { if (DebugMode) { Debug.Log((object)"SingleActionPhysicalEnhancer: Manual gate opening registered."); } _revolver.ToggleState(); ((FVRFireArm)_revolver).PlayAudioEvent((FirearmAudioEventType)17, 1f); _gateHand = null; } else if (num2 > 0.02f && _revolver.m_isStateToggled) { if (DebugMode) { Debug.Log((object)"SingleActionPhysicalEnhancer: Manual gate closing registered."); } _revolver.ToggleState(); ((FVRFireArm)_revolver).PlayAudioEvent((FirearmAudioEventType)18, 1f); _gateHand = null; } } private void UpdateEjectorInteraction(FVRViveHand[] hands) { //IL_0007: 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) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) Vector3 ejectorRod_Pos_Forward = _revolver.EjectorRod_Pos_Forward; Vector3 ejectorRod_Pos_Rearward = _revolver.EjectorRod_Pos_Rearward; if ((Object)(object)_ejectorHand == (Object)null) { foreach (FVRViveHand val in hands) { if (!((Object)(object)val == (Object)null) && !((Object)(object)val.PalmTransform == (Object)null) && !IsHandHoldingGun(val)) { float num = Vector3.Distance(val.PalmTransform.position, _revolver.EjectorRod.position); if (num < 0.04f && val.Input.TriggerPressed) { _ejectorHand = val; break; } } } } else if (!_ejectorHand.Input.TriggerPressed) { _ejectorHand = null; } else { float num2 = Mathf.Clamp(((Component)_revolver).transform.InverseTransformPoint(((HandInput)(ref _ejectorHand.Input)).Pos).z, ejectorRod_Pos_Forward.z, ejectorRod_Pos_Rearward.z); _revolver.EjectorRod.localPosition = new Vector3(_revolver.EjectorRod.localPosition.x, _revolver.EjectorRod.localPosition.y, num2); float num3 = (num2 - ejectorRod_Pos_Forward.z) / (ejectorRod_Pos_Rearward.z - ejectorRod_Pos_Forward.z); if (num3 > 0.9f && !_hasEjectedThisStroke) { if (DebugMode) { Debug.Log((object)"SingleActionPhysicalEnhancer: Ejector stroke completed. Clearing chamber."); } _revolver.EjectPrevCylinder(); _hasEjectedThisStroke = true; } } if ((Object)(object)_ejectorHand == (Object)null) { _revolver.EjectorRod.localPosition = Vector3.MoveTowards(_revolver.EjectorRod.localPosition, ejectorRod_Pos_Forward, Time.deltaTime * 2f); _hasEjectedThisStroke = false; } } private void UpdateCylinderInteraction(FVRViveHand[] hands) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_cylinderHand == (Object)null) { foreach (FVRViveHand val in hands) { if (!((Object)(object)val == (Object)null) && !((Object)(object)val.PalmTransform == (Object)null) && !IsHandHoldingGun(val)) { float num = Vector3.Distance(val.PalmTransform.position, ((Component)_revolver.Cylinder).transform.position); if (num < 0.06f && val.Input.GripPressed && _revolver.m_isStateToggled) { _cylinderHand = val; _hasIndexedThisPress = false; break; } } } } else if (!_cylinderHand.Input.GripPressed || !_revolver.m_isStateToggled) { _cylinderHand = null; } else if (_cylinderHand.Input.TouchpadDown || _cylinderHand.Input.TriggerDown || _cylinderHand.Input.AXButtonDown || _cylinderHand.Input.BYButtonDown) { if (!_hasIndexedThisPress) { if (DebugMode) { Debug.Log((object)"SingleActionPhysicalEnhancer: Offhand index input registered."); } OffsetChamber(1); _hasIndexedThisPress = true; } } else { _hasIndexedThisPress = false; } } private void UpdateCartridgeDetection(FVRViveHand[] hands) { //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) if (!_revolver.m_isStateToggled) { return; } int num = _revolver.PrevChamber; if (_revolver.IsAccessTwoChambersBack) { num = _revolver.PrevChamber2; } FVRFireArmChamber val = _revolver.Cylinder.Chambers[num]; if (val.IsFull) { return; } foreach (FVRViveHand val2 in hands) { if ((Object)(object)val2 == (Object)null) { continue; } FVRInteractiveObject currentInteractable = val2.CurrentInteractable; FVRFireArmRound val3 = (FVRFireArmRound)(object)((currentInteractable is FVRFireArmRound) ? currentInteractable : null); if (!((Object)(object)val3 != (Object)null)) { continue; } float num2 = Vector3.Distance(((Component)val3).transform.position, ((Component)val).transform.position); if (num2 < 0.05f && !IsRoundAlreadySliding(val3)) { if (DebugMode) { Debug.Log((object)("SingleActionPhysicalEnhancer: Proximity trigger met. Dropping cartridge and binding round: " + ((Object)val3).name)); } ((FVRInteractiveObject)val3).ForceBreakInteraction(); BindRoundToChamber(val3, val, val2); } } } private bool IsRoundAlreadySliding(FVRFireArmRound round) { for (int i = 0; i < _slidingRounds.Count; i++) { if ((Object)(object)_slidingRounds[i].Round == (Object)(object)round) { return true; } } return false; } private void BindRoundToChamber(FVRFireArmRound round, FVRFireArmChamber chamber, FVRViveHand hand) { Rigidbody component = ((Component)round).GetComponent(); if ((Object)(object)component != (Object)null) { component.isKinematic = true; component.useGravity = false; } Collider[] componentsInChildren = ((Component)round).GetComponentsInChildren(); Collider[] array = componentsInChildren; foreach (Collider val in array) { val.enabled = false; } float num = 0f - CartridgePivotOffset; ActiveSlidingRound activeSlidingRound = new ActiveSlidingRound(); activeSlidingRound.Round = round; activeSlidingRound.Chamber = chamber; activeSlidingRound.Hand = hand; activeSlidingRound.MaxZ = num; activeSlidingRound.MinZ = num - CartridgeLength; activeSlidingRound.LocalProgress = activeSlidingRound.MinZ; _slidingRounds.Add(activeSlidingRound); } private void UpdateSlidingRounds(FVRViveHand[] hands) { //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Unknown result type (might be due to invalid IL or missing references) for (int num = _slidingRounds.Count - 1; num >= 0; num--) { ActiveSlidingRound activeSlidingRound = _slidingRounds[num]; if ((Object)(object)activeSlidingRound.Round == (Object)null || (Object)(object)activeSlidingRound.Chamber == (Object)null) { _slidingRounds.RemoveAt(num); } else if (((FVRInteractiveObject)activeSlidingRound.Round).IsHeld) { if (DebugMode) { Debug.Log((object)"SingleActionPhysicalEnhancer: Cartridge was grabbed again. Restoring physics."); } RestoreRoundPhysics(activeSlidingRound.Round); _slidingRounds.RemoveAt(num); } else { Vector3 forward = ((Component)activeSlidingRound.Chamber).transform.forward; Vector3 position = ((Component)activeSlidingRound.Chamber).transform.position; foreach (FVRViveHand val in hands) { if (!((Object)(object)val == (Object)null) && !((Object)(object)val.PalmTransform == (Object)null)) { Vector3 val2 = val.PalmTransform.position - position; float num2 = Vector3.Dot(val2, forward); Vector3 val3 = val2 - forward * num2; if (((Vector3)(ref val3)).magnitude < 0.03f && num2 < activeSlidingRound.MaxZ && num2 > activeSlidingRound.LocalProgress) { activeSlidingRound.LocalProgress = num2; } } } ((Component)activeSlidingRound.Round).transform.position = ((Component)activeSlidingRound.Chamber).transform.position + ((Component)activeSlidingRound.Chamber).transform.forward * activeSlidingRound.LocalProgress; ((Component)activeSlidingRound.Round).transform.rotation = ((Component)activeSlidingRound.Chamber).transform.rotation; if (activeSlidingRound.LocalProgress >= activeSlidingRound.MaxZ - 0.002f) { if (DebugMode) { Debug.Log((object)"SingleActionPhysicalEnhancer: Cartridge reached seating threshold. Chambering round."); } activeSlidingRound.Chamber.Autochamber(activeSlidingRound.Round.RoundClass); ((FVRFireArm)_revolver).PlayAudioEvent((FirearmAudioEventType)42, 1f); ((Component)activeSlidingRound.Round).gameObject.SetActive(false); Object.Destroy((Object)(object)((Component)activeSlidingRound.Round).gameObject); _slidingRounds.RemoveAt(num); } } } } private void RestoreRoundPhysics(FVRFireArmRound round) { Rigidbody component = ((Component)round).GetComponent(); if ((Object)(object)component != (Object)null) { component.isKinematic = false; component.useGravity = true; } Collider[] componentsInChildren = ((Component)round).GetComponentsInChildren(); Collider[] array = componentsInChildren; foreach (Collider val in array) { val.enabled = true; } } } public class ActiveSlidingRound { public FVRFireArmRound Round; public FVRFireArmChamber Chamber; public FVRViveHand Hand; public float MinZ; public float MaxZ; public float LocalProgress; } public class MagTapeFix : MonoBehaviour { private enum ActiveMagazine { primary, secondary } private enum AttachedMagazine { none, primary, secondary } [Tooltip("Enable status logging in the Unity console.")] public bool EnableDebug = false; [Tooltip("Main Magazine")] public FVRFireArmMagazine PrimaryMagazine; [Tooltip("Attached Magazine")] public FVRFireArmMagazine SecondaryMagazine; [Tooltip("Tape visuals and colliders (not a requirement)")] public GameObject Tape = null; [Header("Relative Mag Positions (Use Context Menu to calculate)")] [Tooltip("Primary mag position when parented to secondary mag.")] [ReadOnly] public Vector3 Primary2SecondaryPos; [Tooltip("Primary mag rotation when parented to secondary mag.")] [ReadOnly] public Quaternion Primary2SecondaryRot; [Tooltip("Secondary mag position when parented to primary mag.")] [ReadOnly] public Vector3 Secondary2PrimaryPos; [Tooltip("Primary mag rotation when parented to primary mag.")] [ReadOnly] public Quaternion Secondary2PrimaryRot; private ActiveMagazine _activeMagazine = ActiveMagazine.primary; private AttachedMagazine _attachedMagazine = AttachedMagazine.none; private List _primaryColliders = new List(); private List _secondaryColliders = new List(); private void Log(string message, params object[] args) { if (EnableDebug) { if (args != null && args.Length > 0) { Debug.Log((object)string.Format(message, args)); } else { Debug.Log((object)message); } } } [ContextMenu("Calculate Relative Mag Positions")] public void CalculateReltativeMagPositions() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: 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_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) Secondary2PrimaryPos = ((Component)PrimaryMagazine).transform.InverseTransformPoint(((Component)SecondaryMagazine).transform.position); Secondary2PrimaryRot = Quaternion.Inverse(((Component)PrimaryMagazine).transform.rotation) * ((Component)SecondaryMagazine).transform.rotation; Primary2SecondaryPos = ((Component)SecondaryMagazine).transform.InverseTransformPoint(((Component)PrimaryMagazine).transform.position); Primary2SecondaryRot = Quaternion.Inverse(((Component)SecondaryMagazine).transform.rotation) * ((Component)PrimaryMagazine).transform.rotation; Log("[MagTapeFix] Relative positions calculated and updated in Inspector."); } private void SetCollidersAndLayer(FVRFireArmMagazine mag, bool enabled, string layerName) { if ((Object)(object)mag == (Object)null) { return; } ((Component)mag).gameObject.layer = LayerMask.NameToLayer(layerName); Log("[MagTapeFix] Setting root layer of {0} to '{1}'", ((Object)mag).name, layerName); List list = ((!((Object)(object)mag == (Object)(object)PrimaryMagazine)) ? _secondaryColliders : _primaryColliders); Log("[MagTapeFix] Ensuring {0} colliders on {1} stay active (Enabled: {2})", list.Count, ((Object)mag).name, enabled); for (int i = 0; i < list.Count; i++) { if ((Object)(object)list[i] != (Object)null) { list[i].enabled = enabled; } } } public void Start() { //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Invalid comparison between Unknown and I4 //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Invalid comparison between Unknown and I4 Log("[MagTapeFix] Initializing..."); _primaryColliders.Clear(); _secondaryColliders.Clear(); List list = new List(); list.AddRange(((Component)PrimaryMagazine).GetComponentsInChildren(true)); list.AddRange(((Component)SecondaryMagazine).GetComponentsInChildren(true)); HashSet hashSet = new HashSet(list); foreach (Collider item in hashSet) { if (!((Object)(object)item == (Object)null)) { FVRFireArmMagazine componentInParent = ((Component)item).GetComponentInParent(); if ((Object)(object)componentInParent == (Object)(object)PrimaryMagazine) { _primaryColliders.Add(item); } else if ((Object)(object)componentInParent == (Object)(object)SecondaryMagazine) { _secondaryColliders.Add(item); } } } Log("[MagTapeFix] Cached {0} colliders for Primary, {1} for Secondary.", _primaryColliders.Count, _secondaryColliders.Count); if ((int)PrimaryMagazine.State == 1) { Log("[MagTapeFix] Primary Magazine spawned in LOCKED state."); _attachedMagazine = AttachedMagazine.primary; ((FVRPhysicalObject)SecondaryMagazine).StoreAndDestroyRigidbody(); ((FVRPhysicalObject)SecondaryMagazine).RootRigidbody = ((FVRPhysicalObject)PrimaryMagazine).RootRigidbody; SetCollidersAndLayer(SecondaryMagazine, enabled: true, "NoCol"); SetCollidersAndLayer(PrimaryMagazine, enabled: true, "Interactable"); } else if ((int)SecondaryMagazine.State == 1) { Log("[MagTapeFix] Secondary Magazine spawned in LOCKED state."); _attachedMagazine = AttachedMagazine.secondary; _activeMagazine = ActiveMagazine.secondary; ((FVRPhysicalObject)PrimaryMagazine).StoreAndDestroyRigidbody(); ((FVRPhysicalObject)PrimaryMagazine).RootRigidbody = ((FVRPhysicalObject)SecondaryMagazine).RootRigidbody; SetCollidersAndLayer(PrimaryMagazine, enabled: true, "NoCol"); SetCollidersAndLayer(SecondaryMagazine, enabled: true, "Interactable"); } else if ((Object)(object)((Component)PrimaryMagazine).transform.parent == (Object)(object)((Component)SecondaryMagazine).transform) { Log("[MagTapeFix] Spawning with Secondary as parent."); _activeMagazine = ActiveMagazine.secondary; ((FVRPhysicalObject)PrimaryMagazine).StoreAndDestroyRigidbody(); ((FVRPhysicalObject)PrimaryMagazine).RootRigidbody = ((FVRPhysicalObject)SecondaryMagazine).RootRigidbody; SetCollidersAndLayer(PrimaryMagazine, enabled: true, "NoCol"); SetCollidersAndLayer(SecondaryMagazine, enabled: true, "Interactable"); } else { Log("[MagTapeFix] Spawning with Primary as parent (Default)."); _activeMagazine = ActiveMagazine.primary; ((FVRPhysicalObject)SecondaryMagazine).StoreAndDestroyRigidbody(); ((FVRPhysicalObject)SecondaryMagazine).RootRigidbody = ((FVRPhysicalObject)PrimaryMagazine).RootRigidbody; SetCollidersAndLayer(SecondaryMagazine, enabled: true, "NoCol"); SetCollidersAndLayer(PrimaryMagazine, enabled: true, "Interactable"); } } public void Update() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Invalid comparison between Unknown and I4 //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Invalid comparison between Unknown and I4 //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Unknown result type (might be due to invalid IL or missing references) //IL_02e7: Unknown result type (might be due to invalid IL or missing references) //IL_03b0: Unknown result type (might be due to invalid IL or missing references) //IL_03b5: Unknown result type (might be due to invalid IL or missing references) try { if ((int)PrimaryMagazine.State == 1 && _attachedMagazine == AttachedMagazine.none && _activeMagazine == ActiveMagazine.secondary) { Log("[MagTapeFix] Auto-Reload: Primary Magazine locked into magwell. Swapping parents automatically."); _attachedMagazine = AttachedMagazine.primary; ((FVRInteractiveObject)SecondaryMagazine).ForceBreakInteraction(); ((FVRInteractiveObject)SecondaryMagazine).IsHeld = false; UsePrimaryAsParent(((Component)PrimaryMagazine).transform.parent); ((FVRPhysicalObject)SecondaryMagazine).StoreAndDestroyRigidbody(); ((FVRPhysicalObject)SecondaryMagazine).RootRigidbody = ((FVRPhysicalObject)PrimaryMagazine).RootRigidbody; SetCollidersAndLayer(SecondaryMagazine, enabled: true, "NoCol"); SetCollidersAndLayer(PrimaryMagazine, enabled: true, "Interactable"); } else if ((int)SecondaryMagazine.State == 1 && _attachedMagazine == AttachedMagazine.none && _activeMagazine == ActiveMagazine.primary) { Log("[MagTapeFix] Auto-Reload: Secondary Magazine locked into magwell. Swapping parents automatically."); _attachedMagazine = AttachedMagazine.secondary; ((FVRInteractiveObject)PrimaryMagazine).ForceBreakInteraction(); ((FVRInteractiveObject)PrimaryMagazine).IsHeld = false; UseSecondaryAsParent(((Component)SecondaryMagazine).transform.parent); ((FVRPhysicalObject)PrimaryMagazine).StoreAndDestroyRigidbody(); ((FVRPhysicalObject)PrimaryMagazine).RootRigidbody = ((FVRPhysicalObject)SecondaryMagazine).RootRigidbody; SetCollidersAndLayer(PrimaryMagazine, enabled: true, "NoCol"); SetCollidersAndLayer(SecondaryMagazine, enabled: true, "Interactable"); } else if ((int)PrimaryMagazine.State == 0 && (int)SecondaryMagazine.State == 0 && _attachedMagazine != AttachedMagazine.none) { Log("[MagTapeFix] Both magazines are now free (unlocked). Resetting attachment tracking."); _attachedMagazine = AttachedMagazine.none; } if (_activeMagazine == ActiveMagazine.primary) { UpdateSecondaryMagTransform(); } else if (_activeMagazine == ActiveMagazine.secondary) { UpdatePrimaryMagTransform(); } } catch (Exception ex) { if ((Object)(object)PrimaryMagazine == (Object)null || (Object)(object)SecondaryMagazine == (Object)null) { Debug.LogWarning((object)"[MagTapeFix] A magazine was destroyed! Cleaning up component."); Object.Destroy((Object)(object)Tape); Object.Destroy((Object)(object)((Component)this).GetComponent()); } else { Debug.LogError((object)("[MagTapeFix] Error in Update Loop: " + ex.Message)); } } if (_activeMagazine == ActiveMagazine.primary) { if (!((Object)(object)((FVRInteractiveObject)PrimaryMagazine).m_hand != (Object)null)) { return; } FVRViveHand hand = ((FVRInteractiveObject)PrimaryMagazine).m_hand; if (hand.IsInStreamlinedMode) { if (hand.Input.AXButtonDown || hand.Input.TouchpadDown) { Log("[MagTapeFix] Input detected (Streamlined). Initiating manual pose swap to Secondary."); ChangeActiveToSecondary(hand); } } else if (hand.Input.TouchpadDown && Vector2.Angle(hand.Input.TouchpadAxes, Vector2.right) < 45f) { Log("[MagTapeFix] Input detected (Classic). Initiating manual pose swap to Secondary."); ChangeActiveToSecondary(hand); } } else { if (_activeMagazine != ActiveMagazine.secondary || !((Object)(object)((FVRInteractiveObject)SecondaryMagazine).m_hand != (Object)null)) { return; } FVRViveHand hand2 = ((FVRInteractiveObject)SecondaryMagazine).m_hand; if (hand2.IsInStreamlinedMode) { if (hand2.Input.AXButtonDown || hand2.Input.TouchpadDown) { Log("[MagTapeFix] Input detected (Streamlined). Initiating manual pose swap to Primary."); ChangeActiveToPrimary(hand2); } } else if (hand2.Input.TouchpadDown && Vector2.Angle(hand2.Input.TouchpadAxes, Vector2.right) < 45f) { Log("[MagTapeFix] Input detected (Classic). Initiating manual pose swap to Primary."); ChangeActiveToPrimary(hand2); } } } private void UsePrimaryAsParent(Transform parent = null) { Log("[MagTapeFix] Parenting Secondary under Primary."); _activeMagazine = ActiveMagazine.primary; ((Component)PrimaryMagazine).transform.SetParent(parent); ((Component)SecondaryMagazine).transform.SetParent(((Component)PrimaryMagazine).transform); } private void UseSecondaryAsParent(Transform parent = null) { Log("[MagTapeFix] Parenting Primary under Secondary."); _activeMagazine = ActiveMagazine.secondary; ((Component)SecondaryMagazine).transform.SetParent(parent); ((Component)PrimaryMagazine).transform.SetParent(((Component)SecondaryMagazine).transform); } private void UpdateSecondaryMagTransform() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) ((Component)SecondaryMagazine).transform.localPosition = Secondary2PrimaryPos; ((Component)SecondaryMagazine).transform.localRotation = Secondary2PrimaryRot; } private void UpdatePrimaryMagTransform() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) ((Component)PrimaryMagazine).transform.localPosition = Primary2SecondaryPos; ((Component)PrimaryMagazine).transform.localRotation = Primary2SecondaryRot; } private void ChangeActiveToPrimary(FVRViveHand hand) { Log("[MagTapeFix] Manually activating Primary Magazine..."); ((FVRInteractiveObject)SecondaryMagazine).ForceBreakInteraction(); ((FVRInteractiveObject)SecondaryMagazine).IsHeld = false; ((FVRPhysicalObject)PrimaryMagazine).RecoverRigidbody(); UsePrimaryAsParent(); ((FVRPhysicalObject)SecondaryMagazine).StoreAndDestroyRigidbody(); ((FVRPhysicalObject)SecondaryMagazine).RootRigidbody = ((FVRPhysicalObject)PrimaryMagazine).RootRigidbody; SetCollidersAndLayer(SecondaryMagazine, enabled: true, "NoCol"); SetCollidersAndLayer(PrimaryMagazine, enabled: true, "Interactable"); hand.ForceSetInteractable((FVRInteractiveObject)(object)PrimaryMagazine); ((FVRInteractiveObject)PrimaryMagazine).BeginInteraction(hand); Log("[MagTapeFix] Manual pose swap complete. Primary is now active."); } private void ChangeActiveToSecondary(FVRViveHand hand) { Log("[MagTapeFix] Manually activating Secondary Magazine..."); ((FVRInteractiveObject)PrimaryMagazine).ForceBreakInteraction(); ((FVRInteractiveObject)PrimaryMagazine).IsHeld = false; ((FVRPhysicalObject)SecondaryMagazine).RecoverRigidbody(); UseSecondaryAsParent(); ((FVRPhysicalObject)PrimaryMagazine).StoreAndDestroyRigidbody(); ((FVRPhysicalObject)PrimaryMagazine).RootRigidbody = ((FVRPhysicalObject)SecondaryMagazine).RootRigidbody; SetCollidersAndLayer(PrimaryMagazine, enabled: true, "NoCol"); SetCollidersAndLayer(SecondaryMagazine, enabled: true, "Interactable"); hand.ForceSetInteractable((FVRInteractiveObject)(object)SecondaryMagazine); ((FVRInteractiveObject)SecondaryMagazine).BeginInteraction(hand); Log("[MagTapeFix] Manual pose swap complete. Secondary is now active."); } } 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(); 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.AirTronic_PSRL; [BepInPlugin("Volks.AirTronic_PSRL", "AirTronic_PSRL", "1.0.1")] [BepInProcess("h3vr.exe")] [Description("Built with MeatKit")] [BepInDependency("h3vr.otherloader", "1.3.0")] public class AirTronic_PSRLPlugin : 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.AirTronic_PSRL"); OtherLoader.RegisterDirectLoad(BasePath, "Volks.AirTronic_PSRL", "", "", "airtronic_rpg", ""); } } public class UnderbarrelChainsaw : AttachableMeleeWeapon { public AudioSource SawAudio; public AudioSource StartingAudio; public AudioClip AudClip_Start; public AudioClip AudClip_Idle; public AudioClip AudClip_Buzzing; public AudioClip AudClip_Hitting; public bool UsesBladeSolidBits = true; public Renderer BladeSolid; public Renderer BladeBits; public Collider[] BladeCols; public ParticleSystem Sparks; public Transform BladePoint1; public Transform BladePoint2; public ParticleSystem EngineSmoke; public bool UsesEngineRot = true; public Transform EngineRot; public float PerceptibleEventVolume = 50f; public float PerceptibleEventRange = 30f; public float BaseCuttingDamage = 250f; public bool ChainsawDebugMode; private Material m_matBladeSolid; private Material m_matBladeBits; private EmitParams emitParams; private List DamageablesToDo = new List(); private HashSet DamageablesToDoHS = new HashSet(); private List DamageableHitPoints = new List(); private List DamageableHitNormals = new List(); private HashSet m_bladeCols = new HashSet(); private Collider[] m_overlapResults = (Collider[])(object)new Collider[10]; [NonSerialized] [HideInInspector] public float m_sawingIntensity; [NonSerialized] [HideInInspector] public float triggerAmount; [NonSerialized] [HideInInspector] public bool m_isRunning; [NonSerialized] [HideInInspector] public float m_motorSpeed; private float TimeSinceDamageDealing = 0.2f; private float m_timeTilPerceptibleEventTick = 0.2f; private float m_timeSinceCollision = 1f; private int framesTilFlash; private bool m_isCustomLodged; private FixedJoint m_customLodgeJoint; private Rigidbody m_customLodgeTargetRB; private SosigLink m_customLodgeLink; private float m_lodgeContactTimer; public override void Awake() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) ((FVRFireArmAttachment)this).Awake(); emitParams = default(EmitParams); if (UsesBladeSolidBits && (Object)(object)BladeSolid != (Object)null && (Object)(object)BladeBits != (Object)null) { m_matBladeSolid = BladeSolid.materials[0]; m_matBladeBits = BladeBits.material; } for (int i = 0; i < BladeCols.Length; i++) { m_bladeCols.Add(BladeCols[i]); } } public override void UpdateInteraction(FVRViveHand hand) { ((FVRFireArmAttachment)this).UpdateInteraction(hand); if ((Object)(object)hand != (Object)null) { SetMotorPower(hand.Input.TriggerFloat); } } public override void EndInteraction(FVRViveHand hand) { StopMotor(); ((FVRFireArmAttachment)this).EndInteraction(hand); } public override void FVRUpdate() { //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_063d: Unknown result type (might be due to invalid IL or missing references) //IL_0644: Expected O, but got Unknown //IL_067d: Unknown result type (might be due to invalid IL or missing references) //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_026f: Unknown result type (might be due to invalid IL or missing references) //IL_0274: Unknown result type (might be due to invalid IL or missing references) //IL_027e: Unknown result type (might be due to invalid IL or missing references) //IL_0283: Unknown result type (might be due to invalid IL or missing references) //IL_028b: Unknown result type (might be due to invalid IL or missing references) //IL_0296: Unknown result type (might be due to invalid IL or missing references) //IL_029b: Unknown result type (might be due to invalid IL or missing references) //IL_02a0: Unknown result type (might be due to invalid IL or missing references) //IL_02a2: Unknown result type (might be due to invalid IL or missing references) //IL_02aa: Unknown result type (might be due to invalid IL or missing references) //IL_02af: Unknown result type (might be due to invalid IL or missing references) //IL_02b4: Unknown result type (might be due to invalid IL or missing references) //IL_02d4: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_06a9: Unknown result type (might be due to invalid IL or missing references) //IL_06b4: Expected O, but got Unknown //IL_06c4: Unknown result type (might be due to invalid IL or missing references) //IL_06c9: Unknown result type (might be due to invalid IL or missing references) //IL_06d8: Unknown result type (might be due to invalid IL or missing references) //IL_06dd: Unknown result type (might be due to invalid IL or missing references) //IL_06e6: Unknown result type (might be due to invalid IL or missing references) //IL_06eb: Unknown result type (might be due to invalid IL or missing references) //IL_06f0: Unknown result type (might be due to invalid IL or missing references) //IL_087f: Unknown result type (might be due to invalid IL or missing references) //IL_0884: Unknown result type (might be due to invalid IL or missing references) //IL_0888: Unknown result type (might be due to invalid IL or missing references) //IL_088d: Unknown result type (might be due to invalid IL or missing references) //IL_08b1: Unknown result type (might be due to invalid IL or missing references) //IL_0b4a: Unknown result type (might be due to invalid IL or missing references) //IL_0b4f: Unknown result type (might be due to invalid IL or missing references) //IL_0b53: Unknown result type (might be due to invalid IL or missing references) //IL_0b58: Unknown result type (might be due to invalid IL or missing references) //IL_0ba4: Unknown result type (might be due to invalid IL or missing references) //IL_0afd: Unknown result type (might be due to invalid IL or missing references) //IL_0b02: Unknown result type (might be due to invalid IL or missing references) //IL_0b21: Unknown result type (might be due to invalid IL or missing references) //IL_0b26: Unknown result type (might be due to invalid IL or missing references) //IL_0a1d: Unknown result type (might be due to invalid IL or missing references) //IL_0a22: Unknown result type (might be due to invalid IL or missing references) //IL_0a42: Unknown result type (might be due to invalid IL or missing references) //IL_0a47: Unknown result type (might be due to invalid IL or missing references) //IL_083d: Unknown result type (might be due to invalid IL or missing references) //IL_0842: Unknown result type (might be due to invalid IL or missing references) //IL_0857: Unknown result type (might be due to invalid IL or missing references) //IL_085c: Unknown result type (might be due to invalid IL or missing references) //IL_0347: Unknown result type (might be due to invalid IL or missing references) //IL_0349: Unknown result type (might be due to invalid IL or missing references) //IL_034e: Unknown result type (might be due to invalid IL or missing references) //IL_0371: Unknown result type (might be due to invalid IL or missing references) //IL_037c: Unknown result type (might be due to invalid IL or missing references) //IL_0381: Unknown result type (might be due to invalid IL or missing references) //IL_0383: Unknown result type (might be due to invalid IL or missing references) //IL_0388: Unknown result type (might be due to invalid IL or missing references) //IL_038a: Unknown result type (might be due to invalid IL or missing references) //IL_038c: Unknown result type (might be due to invalid IL or missing references) //IL_038e: Unknown result type (might be due to invalid IL or missing references) //IL_0393: Unknown result type (might be due to invalid IL or missing references) //IL_0395: Unknown result type (might be due to invalid IL or missing references) //IL_039c: Unknown result type (might be due to invalid IL or missing references) //IL_03a1: Unknown result type (might be due to invalid IL or missing references) //IL_03a3: Unknown result type (might be due to invalid IL or missing references) //IL_03a5: Unknown result type (might be due to invalid IL or missing references) //IL_03a7: Unknown result type (might be due to invalid IL or missing references) //IL_03ac: Unknown result type (might be due to invalid IL or missing references) //IL_03b4: Unknown result type (might be due to invalid IL or missing references) //IL_03bd: Unknown result type (might be due to invalid IL or missing references) //IL_03c8: Unknown result type (might be due to invalid IL or missing references) //IL_03cd: Unknown result type (might be due to invalid IL or missing references) //IL_03e1: Unknown result type (might be due to invalid IL or missing references) //IL_03e6: Unknown result type (might be due to invalid IL or missing references) //IL_03e8: Unknown result type (might be due to invalid IL or missing references) //IL_03ea: Unknown result type (might be due to invalid IL or missing references) //IL_03f4: Unknown result type (might be due to invalid IL or missing references) //IL_03f9: Unknown result type (might be due to invalid IL or missing references) //IL_03fe: Unknown result type (might be due to invalid IL or missing references) //IL_0400: Unknown result type (might be due to invalid IL or missing references) //IL_0402: Unknown result type (might be due to invalid IL or missing references) //IL_0409: Unknown result type (might be due to invalid IL or missing references) //IL_040e: Unknown result type (might be due to invalid IL or missing references) //IL_0413: Unknown result type (might be due to invalid IL or missing references) //IL_041b: Unknown result type (might be due to invalid IL or missing references) //IL_043b: Unknown result type (might be due to invalid IL or missing references) //IL_0461: Unknown result type (might be due to invalid IL or missing references) //IL_0469: Unknown result type (might be due to invalid IL or missing references) //IL_046e: Unknown result type (might be due to invalid IL or missing references) //IL_0470: Unknown result type (might be due to invalid IL or missing references) //IL_0475: Unknown result type (might be due to invalid IL or missing references) //IL_0479: Unknown result type (might be due to invalid IL or missing references) //IL_048d: Unknown result type (might be due to invalid IL or missing references) //IL_0c34: Unknown result type (might be due to invalid IL or missing references) //IL_0c39: Unknown result type (might be due to invalid IL or missing references) //IL_0d3f: Unknown result type (might be due to invalid IL or missing references) //IL_0528: Unknown result type (might be due to invalid IL or missing references) //IL_053b: Unknown result type (might be due to invalid IL or missing references) //IL_0540: Unknown result type (might be due to invalid IL or missing references) //IL_0542: Unknown result type (might be due to invalid IL or missing references) //IL_0547: Unknown result type (might be due to invalid IL or missing references) //IL_054b: Unknown result type (might be due to invalid IL or missing references) //IL_0cb1: Unknown result type (might be due to invalid IL or missing references) ((FVRPhysicalObject)this).FVRUpdate(); bool flag = false; if ((Object)(object)((FVRFireArmAttachment)this).curMount != (Object)null && ((FVRFireArmAttachment)this).curMount.Parent is FVRFireArm) { FVRPhysicalObject parent = ((FVRFireArmAttachment)this).curMount.Parent; FVRFireArm val = (FVRFireArm)(object)((parent is FVRFireArm) ? parent : null); UnderbarrelChainsawInterface underbarrelChainsawInterface = ((FVRFireArmAttachment)this).AttachmentInterface as UnderbarrelChainsawInterface; if ((Object)(object)((FVRPhysicalObject)val).AltGrip != (Object)null && (Object)(object)((FVRPhysicalObject)val).AltGrip.LastGrabbedInGrip == (Object)(object)underbarrelChainsawInterface && ((FVRInteractiveObject)((FVRPhysicalObject)val).AltGrip).IsHeld) { flag = true; m_isRunning = true; if ((Object)(object)((FVRInteractiveObject)((FVRPhysicalObject)val).AltGrip).m_hand != (Object)null) { triggerAmount = ((FVRInteractiveObject)((FVRPhysicalObject)val).AltGrip).m_hand.Input.TriggerFloat; } } } if (!flag) { if (((FVRInteractiveObject)this).IsHeld && (Object)(object)((FVRInteractiveObject)this).m_hand != (Object)null) { m_isRunning = true; triggerAmount = ((FVRInteractiveObject)this).m_hand.Input.TriggerFloat; } else if (m_isRunning) { StopMotor(); } } if (m_isCustomLodged) { if ((Object)(object)m_customLodgeJoint == (Object)null || (Object)(object)m_customLodgeTargetRB == (Object)null) { BreakCustomLodge(spawnBurst: false); } else { Rigidbody activeRigidbody = GetActiveRigidbody(); if ((Object)(object)activeRigidbody != (Object)null) { float num = Vector3.Dot(activeRigidbody.velocity, -((Component)this).transform.forward); if (num > 3f) { BreakCustomLodge(spawnBurst: true); } } } } else { m_lodgeContactTimer = 0f; } if (framesTilFlash > 0) { framesTilFlash--; } if (m_timeSinceCollision < 1f) { m_timeSinceCollision += Time.deltaTime; } if (TimeSinceDamageDealing > 0f) { TimeSinceDamageDealing -= Time.deltaTime; } else { if (m_isRunning && m_sawingIntensity > 0.1f && (Object)(object)BladePoint1 != (Object)null && (Object)(object)BladePoint2 != (Object)null) { Vector3 val2 = (BladePoint1.position + BladePoint2.position) * 0.5f; Vector3 val3 = BladePoint2.position - BladePoint1.position; Quaternion val4 = Quaternion.LookRotation(val3, ((Component)this).transform.up); Vector3 val5 = default(Vector3); ((Vector3)(ref val5))..ctor(0.04f, 0.12f, ((Vector3)(ref val3)).magnitude * 0.5f); int num2 = Physics.OverlapBoxNonAlloc(val2, val5, m_overlapResults, val4, -1, (QueryTriggerInteraction)2); int num3 = 0; for (int i = 0; i < num2; i++) { Collider val6 = m_overlapResults[i]; if ((Object)(object)val6 == (Object)null || m_bladeCols.Contains(val6) || (Object)(object)((Component)val6).transform.root == (Object)(object)((Component)this).transform.root) { continue; } Vector3 val7 = val6.ClosestPoint(val2); if (num3 < 2) { m_timeSinceCollision = 0f; num3++; Vector3 closestValidPoint = ((FVRInteractiveObject)this).GetClosestValidPoint(BladePoint1.position, BladePoint2.position, val7); Vector3 val8 = val7 - closestValidPoint; val8 = Vector3.ClampMagnitude(val8, 0.04f); Vector3 val9 = closestValidPoint + val8; ((EmitParams)(ref emitParams)).position = val9; Vector3 val10 = Vector3.Cross(((Vector3)(ref val8)).normalized, ((Component)this).transform.right) * Random.Range(1f, 10f); val10 += Random.onUnitSphere * 3f; val10 += val8 * 2f; ((EmitParams)(ref emitParams)).velocity = val10; if ((Object)(object)Sparks != (Object)null) { Sparks.Emit(emitParams, 1); } if (framesTilFlash <= 0) { framesTilFlash = Random.Range(3, 7); Vector3 val11 = ((Component)this).transform.position - val7; FXM.InitiateMuzzleFlash(val9, ((Vector3)(ref val11)).normalized, Random.Range(0.25f, 2f), Color.white, Random.Range(0.5f, 1f)); } } IFVRDamageable component = ((Component)val6).GetComponent(); if (component == null && (Object)(object)val6.attachedRigidbody != (Object)null) { component = ((Component)val6.attachedRigidbody).GetComponent(); } if (component == null || !DamageablesToDoHS.Add(component)) { continue; } if (ChainsawDebugMode) { Debug.Log((object)("Chainsaw: Spatial contact detected with " + ((Object)val6).name)); } DamageablesToDo.Add(component); DamageableHitPoints.Add(val7); List damageableHitNormals = DamageableHitNormals; Vector3 val12 = ((Component)this).transform.position - val7; damageableHitNormals.Add(((Vector3)(ref val12)).normalized); SosigLink component2 = ((Component)val6).GetComponent(); if ((Object)(object)component2 == (Object)null && (Object)(object)val6.attachedRigidbody != (Object)null) { component2 = ((Component)val6.attachedRigidbody).GetComponent(); } if ((Object)(object)component2 != (Object)null && m_sawingIntensity > 0.5f && !m_isCustomLodged) { m_lodgeContactTimer += Time.deltaTime; if (m_lodgeContactTimer >= 0.4f) { TriggerCustomLodge(component2, val6.attachedRigidbody); } } } } if (DamageablesToDo.Count > 0) { if (ChainsawDebugMode) { Debug.Log((object)("Chainsaw: Ticking damage on " + DamageablesToDo.Count + " victims.")); } Damage val13 = new Damage(); val13.Dam_Blunt = 15f; val13.Dam_Cutting = BaseCuttingDamage * m_sawingIntensity; val13.Dam_TotalKinetic = val13.Dam_Cutting + val13.Dam_Blunt; val13.Class = (DamageClass)3; val13.Source_IFF = GM.CurrentPlayerBody.GetPlayerIFF(); for (int j = 0; j < DamageablesToDo.Count; j++) { if ((Object)(MonoBehaviour)DamageablesToDo[j] != (Object)null) { val13.hitNormal = DamageableHitNormals[j]; val13.point = DamageableHitPoints[j]; val13.strikeDir = -val13.hitNormal; DamageablesToDo[j].Damage(val13); } } } DamageablesToDo.Clear(); DamageablesToDoHS.Clear(); DamageableHitPoints.Clear(); DamageableHitNormals.Clear(); Array.Clear(m_overlapResults, 0, m_overlapResults.Length); TimeSinceDamageDealing = 0.1f; } if (!m_isRunning) { if ((Object)(object)SawAudio != (Object)null) { SawAudio.volume = m_motorSpeed * 0.7f; } if ((Object)(object)StartingAudio != (Object)null) { StartingAudio.volume = m_motorSpeed; } if (m_motorSpeed <= 0f && (Object)(object)StartingAudio != (Object)null && StartingAudio.isPlaying) { StartingAudio.Stop(); } if (UsesBladeSolidBits && (Object)(object)m_matBladeSolid != (Object)null && (Object)(object)m_matBladeBits != (Object)null) { m_matBladeSolid.SetVector("_MainTexVelocity", Vector4.op_Implicit(Vector2.zero)); m_matBladeBits.SetVector("_MainTexVelocity", Vector4.op_Implicit(Vector2.zero)); } if ((Object)(object)EngineSmoke != (Object)null) { EmissionModule emission = EngineSmoke.emission; MinMaxCurve rateOverTime = ((EmissionModule)(ref emission)).rateOverTime; ((MinMaxCurve)(ref rateOverTime)).mode = (ParticleSystemCurveMode)0; ((MinMaxCurve)(ref rateOverTime)).constantMax = 0f; ((MinMaxCurve)(ref rateOverTime)).constantMin = 0f; ((EmissionModule)(ref emission)).rateOverTime = rateOverTime; } } else { if ((Object)(object)SawAudio != (Object)null && !SawAudio.isPlaying) { SawAudio.Play(); } triggerAmount += Random.Range(-0.05f, 0.05f); m_sawingIntensity = Mathf.Lerp(m_sawingIntensity, triggerAmount, Time.deltaTime * 5f); if (m_sawingIntensity > 0.1f) { if ((Object)(object)SawAudio != (Object)null) { SawAudio.volume = (0.8f + m_sawingIntensity * 0.5f) * 0.3f; SawAudio.pitch = 0.6f + m_sawingIntensity * 0.7f; AudioClip val14 = ((!(m_timeSinceCollision < 0.2f)) ? AudClip_Buzzing : AudClip_Hitting); if ((Object)(object)SawAudio.clip != (Object)(object)val14) { SawAudio.clip = val14; } } if (UsesBladeSolidBits && (Object)(object)m_matBladeSolid != (Object)null && (Object)(object)m_matBladeBits != (Object)null) { m_matBladeSolid.SetVector("_MainTexVelocity", Vector4.op_Implicit(new Vector2(m_sawingIntensity, 0f))); m_matBladeBits.SetVector("_MainTexVelocity", Vector4.op_Implicit(new Vector2(m_sawingIntensity, 0f))); } } else { if ((Object)(object)SawAudio != (Object)null) { SawAudio.volume = 0.25f; SawAudio.pitch = 1f; if ((Object)(object)SawAudio.clip != (Object)(object)AudClip_Idle) { SawAudio.clip = AudClip_Idle; } } if (UsesBladeSolidBits && (Object)(object)m_matBladeSolid != (Object)null && (Object)(object)m_matBladeBits != (Object)null) { m_matBladeSolid.SetVector("_MainTexVelocity", Vector4.op_Implicit(new Vector2(0.01f, 0f))); m_matBladeBits.SetVector("_MainTexVelocity", Vector4.op_Implicit(new Vector2(0.01f, 0f))); } } if ((Object)(object)EngineSmoke != (Object)null) { EmissionModule emission2 = EngineSmoke.emission; MinMaxCurve rateOverTime2 = ((EmissionModule)(ref emission2)).rateOverTime; ((MinMaxCurve)(ref rateOverTime2)).mode = (ParticleSystemCurveMode)0; ((MinMaxCurve)(ref rateOverTime2)).constantMax = m_motorSpeed * 2f + m_sawingIntensity * 20f; ((MinMaxCurve)(ref rateOverTime2)).constantMin = m_motorSpeed * 2f + m_sawingIntensity * 20f; ((EmissionModule)(ref emission2)).rateOverTime = rateOverTime2; } } if (m_isRunning) { if (m_motorSpeed < 1f) { m_motorSpeed = 1f; } } else { m_motorSpeed -= Time.deltaTime * 3f; m_motorSpeed = Mathf.Clamp(m_motorSpeed, 0f, 1f); } if (UsesEngineRot && (Object)(object)EngineRot != (Object)null) { float x = EngineRot.localEulerAngles.x; x = ((!(m_sawingIntensity > 0f)) ? (x + Time.deltaTime * (360f * m_motorSpeed)) : (x + Time.deltaTime * (360f + m_sawingIntensity * 1200f))); x = Mathf.Repeat(x, 360f); EngineRot.localEulerAngles = new Vector3(x, 0f, 0f); } if (m_isRunning) { m_timeTilPerceptibleEventTick -= Time.deltaTime; if (m_timeTilPerceptibleEventTick <= 0f) { m_timeTilPerceptibleEventTick = Random.Range(0.2f, 0.3f); GM.CurrentSceneSettings.OnPerceiveableSound(PerceptibleEventVolume * m_motorSpeed * m_sawingIntensity * 0.5f, PerceptibleEventRange * m_motorSpeed * m_sawingIntensity * 0.5f, ((Component)this).transform.position, GM.CurrentPlayerBody.GetPlayerIFF(), GM.CurrentPlayerBody.PlayerEntities[0]); } } } public override void FVRFixedUpdate() { //IL_003c: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) ((FVRFireArmAttachment)this).FVRFixedUpdate(); if (m_isRunning) { Rigidbody activeRigidbody = GetActiveRigidbody(); if ((Object)(object)activeRigidbody != (Object)null) { float num = 0.1f + m_sawingIntensity * 0.3f; activeRigidbody.velocity += Random.onUnitSphere * num; activeRigidbody.angularVelocity += Random.onUnitSphere * num; } } } public void SetMotorPower(float intensity) { if (ChainsawDebugMode) { Debug.Log((object)("Chainsaw: SetMotorPower called with intensity: " + intensity)); } triggerAmount = intensity; m_isRunning = true; if (m_motorSpeed <= 0.1f && (Object)(object)StartingAudio != (Object)null && !StartingAudio.isPlaying) { StartingAudio.Play(); } m_motorSpeed += Time.deltaTime * 3f; m_motorSpeed = Mathf.Clamp(m_motorSpeed, 0f, 1f); } public void StopMotor() { if (ChainsawDebugMode) { Debug.Log((object)"Chainsaw: StopMotor called"); } m_isRunning = false; triggerAmount = 0f; m_sawingIntensity = 0f; DamageablesToDo.Clear(); DamageablesToDoHS.Clear(); DamageableHitPoints.Clear(); DamageableHitNormals.Clear(); Array.Clear(m_overlapResults, 0, m_overlapResults.Length); BreakCustomLodge(spawnBurst: false); } private Rigidbody GetActiveRigidbody() { if ((Object)(object)((FVRPhysicalObject)this).RootRigidbody != (Object)null) { return ((FVRPhysicalObject)this).RootRigidbody; } return ((Component)this).GetComponentInParent(); } private void TriggerCustomLodge(SosigLink link, Rigidbody targetRB) { Rigidbody activeRigidbody = GetActiveRigidbody(); if (!((Object)(object)activeRigidbody == (Object)null) && !((Object)(object)targetRB == (Object)null)) { m_isCustomLodged = true; m_customLodgeTargetRB = targetRB; m_customLodgeLink = link; m_customLodgeJoint = ((Component)activeRigidbody).gameObject.AddComponent(); ((Joint)m_customLodgeJoint).connectedBody = targetRB; ((Joint)m_customLodgeJoint).enableCollision = false; if (ChainsawDebugMode) { Debug.Log((object)("Chainsaw: Custom lodged into " + ((Object)link).name)); } } } private void BreakCustomLodge(bool spawnBurst) { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: 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_00c6: Expected O, but got Unknown //IL_00da: 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) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)m_customLodgeJoint != (Object)null) { Object.Destroy((Object)(object)m_customLodgeJoint); } if (spawnBurst && (Object)(object)m_customLodgeLink != (Object)null && (Object)(object)m_customLodgeLink.S != (Object)null && (Object)(object)BladePoint1 != (Object)null && (Object)(object)BladePoint2 != (Object)null) { Vector3 val = (BladePoint1.position + BladePoint2.position) * 0.5f; m_customLodgeLink.S.SpawnLargeMustardBurst(val, -((Component)this).transform.forward * 5f); Damage val2 = new Damage(); val2.Dam_Cutting = BaseCuttingDamage * 1.5f; val2.Class = (DamageClass)3; val2.Source_IFF = GM.CurrentPlayerBody.GetPlayerIFF(); val2.point = val; val2.strikeDir = -((Component)this).transform.forward; m_customLodgeLink.Damage(val2); } m_isCustomLodged = false; m_customLodgeTargetRB = null; m_customLodgeLink = null; m_lodgeContactTimer = 0f; } } public class UnderbarrelChainsawInterface : AttachableForegrip { public bool ChainsawInterfaceDebug; public override void OnAttach() { ((FVRFireArmAttachmentInterface)this).OnAttach(); if (ChainsawInterfaceDebug) { Debug.Log((object)"Interface: OnAttach called"); } if ((Object)(object)((FVRFireArmAttachmentInterface)this).Attachment != (Object)null && (Object)(object)((FVRFireArmAttachmentInterface)this).Attachment.curMount != (Object)null && ((FVRFireArmAttachmentInterface)this).Attachment.curMount.Parent is FVRFireArm) { FVRPhysicalObject parent = ((FVRFireArmAttachmentInterface)this).Attachment.curMount.Parent; FVRFireArm val = (FVRFireArm)(object)((parent is FVRFireArm) ? parent : null); ? val2 = val; FVRFireArmAttachment attachment = ((FVRFireArmAttachmentInterface)this).Attachment; ((FVRFireArm)val2).RegisterAttachedMeleeWeapon((AttachableMeleeWeapon)(object)((attachment is AttachableMeleeWeapon) ? attachment : null)); } } public override void OnDetach() { if (ChainsawInterfaceDebug) { Debug.Log((object)"Interface: OnDetach called"); } if ((Object)(object)((FVRFireArmAttachmentInterface)this).Attachment != (Object)null && (Object)(object)((FVRFireArmAttachmentInterface)this).Attachment.curMount != (Object)null && ((FVRFireArmAttachmentInterface)this).Attachment.curMount.Parent is FVRFireArm) { FVRPhysicalObject parent = ((FVRFireArmAttachmentInterface)this).Attachment.curMount.Parent; FVRFireArm val = (FVRFireArm)(object)((parent is FVRFireArm) ? parent : null); val.RegisterAttachedMeleeWeapon((AttachableMeleeWeapon)null); } ((FVRFireArmAttachmentInterface)this).OnDetach(); } }