Decompiled source of 762Tokarev Additional v1.0.0
762Tokarev_Additional.dll
Decompiled a day ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; 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 OpenScripts2; using OtherLoader; using UnityEngine; using UnityEngine.UI; [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] public class WinterTrigger : FVRInteractiveObject { [Header("Deploy")] public Transform Pivot; public Vector3 StowedLocalEuler; public Vector3 DeployedLocalEuler; public float DeploySpeed = 6f; [Header("Trigger Follow")] public ClosedBoltWeapon Weapon; public Transform WeaponTrigger; public Transform WinterTriggerTransform; public bool FollowRotation = true; public Vector3 RotationOffset; public bool FollowTranslation; public Vector3 PositionOffset; private bool m_isDeployed; private float m_deployLerp; private Quaternion m_stowedTriggerRotation; private Vector3 m_stowedTriggerPosition; private bool m_hasStowedTriggerPose; public override void Awake() { ((FVRInteractiveObject)this).Awake(); CacheWeaponTrigger(); CacheStowedTriggerPose(); SetPivotPose(0f); } public override void SimpleInteraction(FVRViveHand hand) { ((FVRInteractiveObject)this).SimpleInteraction(hand); m_isDeployed = !m_isDeployed; } public override void FVRUpdate() { ((FVRInteractiveObject)this).FVRUpdate(); CacheWeaponTrigger(); float num = ((!m_isDeployed) ? 0f : 1f); m_deployLerp = Mathf.MoveTowards(m_deployLerp, num, DeploySpeed * Time.deltaTime); SetPivotPose(m_deployLerp); if (m_isDeployed) { ApplyTriggerFollow(); } else { RestoreStowedTriggerPose(); } } private void CacheWeaponTrigger() { if ((Object)(object)WeaponTrigger == (Object)null && (Object)(object)Weapon != (Object)null) { WeaponTrigger = Weapon.Trigger; } } private void CacheStowedTriggerPose() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)WinterTriggerTransform == (Object)null)) { m_stowedTriggerRotation = WinterTriggerTransform.localRotation; m_stowedTriggerPosition = WinterTriggerTransform.localPosition; m_hasStowedTriggerPose = true; } } private void SetPivotPose(float t) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)Pivot == (Object)null)) { Quaternion val = Quaternion.Euler(StowedLocalEuler); Quaternion val2 = Quaternion.Euler(DeployedLocalEuler); Pivot.localRotation = Quaternion.Slerp(val, val2, t); } } private void ApplyTriggerFollow() { //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_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)WinterTriggerTransform == (Object)null) && !((Object)(object)WeaponTrigger == (Object)null)) { if (FollowRotation) { WinterTriggerTransform.localRotation = WeaponTrigger.localRotation * Quaternion.Euler(RotationOffset); } if (FollowTranslation) { WinterTriggerTransform.localPosition = WeaponTrigger.localPosition + PositionOffset; } } } private void RestoreStowedTriggerPose() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) if (m_hasStowedTriggerPose && !((Object)(object)WinterTriggerTransform == (Object)null)) { WinterTriggerTransform.localRotation = m_stowedTriggerRotation; WinterTriggerTransform.localPosition = m_stowedTriggerPosition; } } } public class MDTCkyeBipodController : MonoBehaviour { public Transform GroundContactReference; public LayerMask ValidGroundLayers; public float RaycastDistance = 0.5f; private Vector3 lastExternalPosition; private void Start() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)GroundContactReference != (Object)null) { lastExternalPosition = GroundContactReference.position; } } private void LateUpdate() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //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) if ((Object)(object)GroundContactReference != (Object)null && GroundContactReference.position != lastExternalPosition) { UpdateGroundPoint(); lastExternalPosition = GroundContactReference.position; } } private void UpdateGroundPoint() { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: 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_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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) //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_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_0052: 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_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_00c1: 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_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) Ray val = default(Ray); ((Ray)(ref val))..ctor(GroundContactReference.position, -Vector3.up); RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(val, ref val2, RaycastDistance, LayerMask.op_Implicit(ValidGroundLayers))) { float y = GroundContactReference.position.y; float y2 = ((RaycastHit)(ref val2)).point.y; if (Mathf.Abs(y - y2) > 0.001f) { GroundContactReference.position = new Vector3(GroundContactReference.position.x, y2, GroundContactReference.position.z); } Debug.DrawRay(GroundContactReference.position, -Vector3.up * RaycastDistance, Color.green); } else { Debug.DrawRay(GroundContactReference.position, -Vector3.up * RaycastDistance, Color.red); } } } public class ForeMagRelease : UniversalAdvancedMagazineGrabTrigger { [Header("ForeMagRelease Config")] public bool EjectMainMagOnSecondaryRelease = true; private bool wasSecondaryMagPresent = true; public override void UpdateInteraction(FVRViveHand hand) { ((UniversalAdvancedMagazineGrabTrigger)this).UpdateInteraction(hand); if (base.IsSecondarySlotGrab) { FVRFireArmMagazine magazine = base.FireArm.SecondaryMagazineSlots[base.SecondaryGrabSlot].Magazine; if (wasSecondaryMagPresent && (Object)(object)magazine == (Object)null && EjectMainMagOnSecondaryRelease && (Object)(object)base.FireArm.Magazine != (Object)null) { base.FireArm.EjectMag(false); } wasSecondaryMagPresent = (Object)(object)magazine != (Object)null; } else { wasSecondaryMagPresent = true; } } } public class AmmoRecoilBlast : MonoBehaviour { public BallisticProjectile Projectile; [Header("Recoil Settings")] [Tooltip("Total distance in meters the player slides back.")] public float RecoilDistance = 0.5f; [Tooltip("How long the slide-back takes in seconds.")] public float RecoilDuration = 0.15f; private bool _hasBlasted = false; private void Start() { if ((Object)(object)Projectile == (Object)null) { Projectile = ((Component)this).GetComponent<BallisticProjectile>(); } ((MonoBehaviour)this).StartCoroutine(WaitAndApplyRecoil()); } private IEnumerator WaitAndApplyRecoil() { while ((Object)(object)Projectile != (Object)null && !Projectile.IsMoving()) { yield return null; } if (!_hasBlasted) { _hasBlasted = true; ((MonoBehaviour)this).StartCoroutine(SlideBack()); } } private IEnumerator SlideBack() { if ((Object)(object)GM.CurrentMovementManager == (Object)null) { yield break; } Vector3 shotDir = Vector3.forward; if ((Object)(object)Projectile != (Object)null && (Object)(object)((Component)Projectile).transform != (Object)null) { shotDir = ((Component)Projectile).transform.forward; } Vector3 recoilDir = -shotDir; recoilDir.y = 0f; ((Vector3)(ref recoilDir)).Normalize(); if (!(((Vector3)(ref recoilDir)).sqrMagnitude < 0.001f)) { Transform mmTransform = ((Component)GM.CurrentMovementManager).transform; float elapsed = 0f; float totalMoved = 0f; while (elapsed < RecoilDuration && totalMoved < RecoilDistance) { elapsed += Time.deltaTime; float t = Mathf.Clamp01(elapsed / RecoilDuration); float easedSpeed = Mathf.Lerp(RecoilDistance / RecoilDuration, 0f, t); float step2 = easedSpeed * Time.deltaTime; step2 = Mathf.Min(step2, RecoilDistance - totalMoved); Vector3 offset = recoilDir * step2; mmTransform.position += offset; totalMoved += step2; yield return null; } } } } public class BoxMagBeltFix : MonoBehaviour { public FVRFireArm targetGun; public GameObject boxMagazineObject; private FVRFireArmMagazine boxMagazine; private GameObject beltVisual; private bool beltHidden = false; private void Start() { if ((Object)(object)targetGun == (Object)null) { Debug.LogError((object)"BoxMagBeltFix: targetGun not assigned!"); ((Behaviour)this).enabled = false; return; } if ((Object)(object)targetGun.BeltDD != (Object)null) { beltVisual = ((Component)targetGun.BeltDD).gameObject; } if ((Object)(object)boxMagazineObject != (Object)null) { boxMagazine = boxMagazineObject.GetComponent<FVRFireArmMagazine>(); if ((Object)(object)boxMagazine == (Object)null) { Debug.LogError((object)"BoxMagBeltFix: boxMagazineObject does not have FVRFireArmMagazine component!"); ((Behaviour)this).enabled = false; return; } FVRFireArmBeltSegment[] componentsInChildren = ((Component)targetGun).GetComponentsInChildren<FVRFireArmBeltSegment>(true); FVRFireArmBeltSegment[] array = componentsInChildren; foreach (FVRFireArmBeltSegment val in array) { if ((Object)(object)targetGun.BeltDD == (Object)null || (Object)(object)((Component)val).gameObject != (Object)(object)((Component)targetGun.BeltDD).gameObject) { Object.Destroy((Object)(object)((Component)val).gameObject); } } } else { Debug.LogError((object)"BoxMagBeltFix: boxMagazineObject not assigned!"); ((Behaviour)this).enabled = false; } } private void Update() { //IL_004a: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)boxMagazine == (Object)null || (Object)(object)targetGun == (Object)null) { return; } if ((Object)(object)targetGun.Magazine != (Object)(object)boxMagazine && (int)boxMagazine.State == 0) { targetGun.LoadMag(boxMagazine); } bool flag = (Object)(object)targetGun.Magazine == (Object)(object)boxMagazine; if (flag && !beltHidden) { if ((Object)(object)beltVisual != (Object)null) { beltVisual.SetActive(false); } FVRFireArmBeltSegment[] componentsInChildren = ((Component)targetGun).GetComponentsInChildren<FVRFireArmBeltSegment>(true); FVRFireArmBeltSegment[] array = componentsInChildren; foreach (FVRFireArmBeltSegment val in array) { if ((Object)(object)((Component)val).gameObject != (Object)(object)((Component)targetGun.BeltDD).gameObject) { Object.Destroy((Object)(object)((Component)val).gameObject); } } beltHidden = true; } else if (!flag && beltHidden) { if ((Object)(object)beltVisual != (Object)null) { beltVisual.SetActive(true); } beltHidden = false; } } } public class ForwardAssist : FVRInteractiveObject { [Header("Animation Settings")] public Transform TargetTransform; public Vector3 StartPosition; public Vector3 EndPosition; public Vector3 StartRotation; public Vector3 EndRotation; public float MoveSpeed = 10f; public float ResetDelay = 0.2f; [Header("Audio Settings")] public AudioEvent PokeAudioEvent; public FVRPooledAudioType AudioType = (FVRPooledAudioType)0; private float m_animFloat = 0f; private bool m_isPoked = false; private float m_resetTimer = 0f; protected void Awake() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) ((FVRInteractiveObject)this).Awake(); if ((Object)(object)TargetTransform == (Object)null) { TargetTransform = ((Component)this).transform; } if (StartPosition == Vector3.zero) { StartPosition = TargetTransform.localPosition; } if (StartRotation == Vector3.zero) { StartRotation = TargetTransform.localEulerAngles; } } public override void Poke(FVRViveHand hand) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (PokeAudioEvent != null) { SM.PlayCoreSound(AudioType, PokeAudioEvent, ((Component)this).transform.position); } m_isPoked = true; m_resetTimer = ResetDelay; } private void Update() { //IL_009d: 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_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) if (m_isPoked) { m_animFloat = Mathf.MoveTowards(m_animFloat, 1f, Time.deltaTime * MoveSpeed); m_resetTimer -= Time.deltaTime; if (m_resetTimer <= 0f) { m_isPoked = false; } } else { m_animFloat = Mathf.MoveTowards(m_animFloat, 0f, Time.deltaTime * MoveSpeed); } if ((Object)(object)TargetTransform != (Object)null) { TargetTransform.localPosition = Vector3.Lerp(StartPosition, EndPosition, m_animFloat); TargetTransform.localEulerAngles = Vector3.Lerp(StartRotation, EndRotation, m_animFloat); } } } public class ResidualBeltLinkHandler : MonoBehaviour { public enum Axis { X, Y, Z } [Header("References")] public FVRFireArm Firearm; public Transform FeedTraySpawnPoint; public GameObject BeltLinkPrefab; [Header("Feed Tray")] public Transform FeedTray; public float FeedTrayClearAngleMin = 55f; public float FeedTrayClearAngleMax = 70f; public Axis FeedTrayClearAxis = Axis.X; [Header("Behavior")] public float AutoCleanupTime = 10f; public float ShakeClearAngularVelocity = 6f; public float HandClearVelocity = 0.5f; private GameObject _spawnedLink; private Rigidbody _linkRB; private bool _hasResidualLink; private float _cleanupTimer; private float _currentClearAngle; private int _lastKnownRounds = -1; private void Update() { //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Firearm != (Object)null && (Object)(object)Firearm.Magazine != (Object)null) { int numRounds = Firearm.Magazine.m_numRounds; if (_lastKnownRounds > 0 && numRounds == 0 && !_hasResidualLink) { SpawnResidualLink(); } _lastKnownRounds = numRounds; } if (!_hasResidualLink) { return; } _cleanupTimer += Time.deltaTime; if ((Object)(object)_spawnedLink == (Object)null || _cleanupTimer > AutoCleanupTime) { ClearResidualLink(); return; } if ((Object)(object)Firearm != (Object)null && (Object)(object)((FVRPhysicalObject)Firearm).RootRigidbody != (Object)null) { Vector3 angularVelocity = ((FVRPhysicalObject)Firearm).RootRigidbody.angularVelocity; if (((Vector3)(ref angularVelocity)).magnitude > ShakeClearAngularVelocity) { ClearResidualLink(); } } if ((Object)(object)FeedTray != (Object)null) { float num = 0f; switch (FeedTrayClearAxis) { case Axis.X: num = Mathf.Abs(Mathf.DeltaAngle(FeedTray.localEulerAngles.x, 0f)); break; case Axis.Y: num = Mathf.Abs(Mathf.DeltaAngle(FeedTray.localEulerAngles.y, 0f)); break; case Axis.Z: num = Mathf.Abs(Mathf.DeltaAngle(FeedTray.localEulerAngles.z, 0f)); break; } if (num > _currentClearAngle && num < 180f) { ClearResidualLink(); } } } private void OnTriggerEnter(Collider other) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: 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_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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) if (_hasResidualLink) { FVRViveHand componentInParent = ((Component)other).GetComponentInParent<FVRViveHand>(); if ((Object)(object)componentInParent != (Object)null && (Object)(object)_linkRB != (Object)null) { Vector3 normalized = ((Vector3)(ref componentInParent.Input.VelLinearWorld)).normalized; _linkRB.AddForce(normalized * 5f, (ForceMode)1); _linkRB.AddTorque(Random.onUnitSphere * 2f, (ForceMode)1); ClearResidualLinkPhysicsDelayed(5f); } } } public void SpawnResidualLink() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) if (!_hasResidualLink && !((Object)(object)BeltLinkPrefab == (Object)null)) { _spawnedLink = Object.Instantiate<GameObject>(BeltLinkPrefab, FeedTraySpawnPoint.position, FeedTraySpawnPoint.rotation); _linkRB = _spawnedLink.GetComponent<Rigidbody>(); if ((Object)(object)_linkRB != (Object)null && (Object)(object)((FVRPhysicalObject)Firearm).RootRigidbody != (Object)null) { _linkRB.velocity = ((FVRPhysicalObject)Firearm).RootRigidbody.velocity; } _cleanupTimer = 0f; _hasResidualLink = true; _currentClearAngle = Random.Range(FeedTrayClearAngleMin, FeedTrayClearAngleMax); Firearm.HasBelt = false; Firearm.ConnectedToBox = false; } } private void ClearResidualLinkPhysicsDelayed(float delay) { if ((Object)(object)_spawnedLink != (Object)null) { Object.Destroy((Object)(object)_spawnedLink, delay); } _spawnedLink = null; _linkRB = null; _hasResidualLink = false; _cleanupTimer = 0f; } private void ClearResidualLink() { if ((Object)(object)_spawnedLink != (Object)null) { Object.Destroy((Object)(object)_spawnedLink); } _spawnedLink = null; _linkRB = null; _hasResidualLink = false; _cleanupTimer = 0f; } public bool CanAcceptNewBelt() { return !_hasResidualLink; } } public class SAFA_BoltController : MonoBehaviour { private enum BoltState { semiAuto, fullAuto, safe, uncocked } public OpenBoltReceiver weapon; public int semiAuto; public int fullAuto; public Transform closedBoltSearPosition; private OpenBoltReceiverBolt bolt; private Transform sear; private Vector3 uncockedPos; private Transform openBoltSearPosition; private string lastMessage = ""; private bool waitForShot; private BoltState boltState; public void Start() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) bolt = weapon.Bolt; sear = weapon.Bolt.Point_Bolt_LockPoint; uncockedPos = weapon.Bolt.Point_Bolt_Forward.localPosition; openBoltSearPosition = sear; } public void Update() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_006d: 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_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0195: 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_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Unknown result type (might be due to invalid IL or missing references) if (((Component)bolt).transform.localPosition == uncockedPos) { boltState = BoltState.uncocked; } else if (((Component)bolt).transform.localPosition == openBoltSearPosition.localPosition) { boltState = BoltState.fullAuto; } else if (((Component)bolt).transform.localPosition == closedBoltSearPosition.localPosition) { boltState = BoltState.semiAuto; } if (boltState == BoltState.uncocked && weapon.m_fireSelectorMode == fullAuto) { bolt.m_boltZ_lock = openBoltSearPosition.localPosition.z; } else if (boltState == BoltState.uncocked && weapon.m_fireSelectorMode == semiAuto) { bolt.m_boltZ_lock = closedBoltSearPosition.localPosition.z; } else if (boltState == BoltState.semiAuto && weapon.m_fireSelectorMode == fullAuto) { waitForShot = true; } else if (boltState == BoltState.fullAuto && weapon.m_fireSelectorMode == semiAuto) { bolt.m_boltZ_lock = closedBoltSearPosition.localPosition.z; bolt.LastPos = (BoltPos)4; bolt.CurPos = (BoltPos)3; } if (waitForShot && (int)bolt.LastPos == 0) { bolt.m_boltZ_lock = openBoltSearPosition.localPosition.z; waitForShot = false; } } public void DebugOnce(string message) { if (message != lastMessage) { Debug.Log((object)message); } lastMessage = message; } } public class EjectMagRounds : FVRInteractiveObject { [Header("References")] public FVRFireArm firearm; public FVRFireArmMagazine targetMagazine; [Header("Ejection")] public Transform ejectOrigin; public float ejectionForce = 1f; [Range(0f, 45f)] public float spreadAngle = 8f; [Tooltip("Time in seconds between each spawned round. 0 => all spawn in the same frame (but still yields once per round).")] public float perRoundSpawnDelay = 0.06f; [Header("Direction override")] [Tooltip("If non-zero, uses this vector as the base ejection direction. If UseLocalDirection = true, this vector is interpreted in the ejectOrigin's local space (or firearm/local if ejectOrigin is null).")] public Vector3 ejectDirection = Vector3.zero; public bool UseLocalEjectDirection = true; [Header("Audio")] public AudioEvent AudEvent_ButtonPress; public AudioEvent AudEvent_RoundEject; private bool m_isEjecting; [Header("Auto-assign")] public int magazineIndex = -1; [Header("Button visual (ClosedBolt-style)")] [Tooltip("Transform to animate (press/unpress).")] public Transform ButtonTransform; [Tooltip("Unpressed target vector (local pos or euler depending on interp).")] public Vector3 ButtonUnpressed = Vector3.zero; [Tooltip("Pressed target vector (local pos or euler depending on interp).")] public Vector3 ButtonPressed = new Vector3(0f, 0f, -0.02f); public InterpStyle ButtonInterp = (InterpStyle)0; [Tooltip("Speed of button return/press interpolation (larger = faster).")] public float ButtonAnimSpeed = 12f; private bool WasButtonHeldDown; private bool m_isAnimating; private Vector3 m_animStartPos; private Vector3 m_animTargetPos; private Quaternion m_animStartRot; private Quaternion m_animTargetRot; private float m_animT; private InterpStyle m_animInterp; private Transform m_animTransform; public override void Awake() { //IL_009f: 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_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) ((FVRInteractiveObject)this).Awake(); if (!((Object)(object)targetMagazine == (Object)null) || !((Object)(object)firearm != (Object)null)) { return; } try { FVRFireArmMagazine[] componentsInChildren = ((Component)firearm).GetComponentsInChildren<FVRFireArmMagazine>(true); if (componentsInChildren == null || componentsInChildren.Length <= 0) { return; } if (magazineIndex >= 0 && magazineIndex < componentsInChildren.Length) { targetMagazine = componentsInChildren[magazineIndex]; return; } Vector3 val = ((!((Object)(object)ejectOrigin != (Object)null)) ? ((Component)this).transform.position : ejectOrigin.position); float num = float.MaxValue; int num2 = 0; for (int i = 0; i < componentsInChildren.Length; i++) { Vector3 val2 = ((Component)componentsInChildren[i]).transform.position - val; float sqrMagnitude = ((Vector3)(ref val2)).sqrMagnitude; if (sqrMagnitude < num) { num = sqrMagnitude; num2 = i; } } targetMagazine = componentsInChildren[num2]; } catch { } } public override void SimpleInteraction(FVRViveHand hand) { //IL_0047: Unknown result type (might be due to invalid IL or missing references) ((FVRInteractiveObject)this).SimpleInteraction(hand); if ((Object)(object)firearm == (Object)null && (Object)(object)targetMagazine == (Object)null) { return; } if (AudEvent_ButtonPress != null) { SM.PlayGenericSound(AudEvent_ButtonPress, ((Component)this).transform.position); } else { try { if ((Object)(object)firearm != (Object)null) { firearm.PlayAudioEvent((FirearmAudioEventType)29, 1f); } } catch { } } if (!m_isEjecting) { ((MonoBehaviour)this).StartCoroutine(EjectAllRoundsCoroutine()); } } private IEnumerator EjectAllRoundsCoroutine() { m_isEjecting = true; if ((Object)(object)firearm == (Object)null && (Object)(object)targetMagazine == (Object)null) { m_isEjecting = false; yield break; } FVRFireArmMagazine mag = targetMagazine; if ((Object)(object)mag == (Object)null && (Object)(object)firearm != (Object)null) { try { mag = firearm.Magazine; } catch { mag = null; } } if ((Object)(object)mag == (Object)null) { m_isEjecting = false; yield break; } while (mag.HasARound()) { GameObject prefab = null; try { prefab = mag.RemoveRound(false); } catch { try { mag.RemoveRound(); } catch { } } if ((Object)(object)prefab != (Object)null) { Vector3 val; Quaternion val2; if ((Object)(object)ejectOrigin != (Object)null) { val = ejectOrigin.position; val2 = ejectOrigin.rotation; } else { val = ((!((Object)(object)firearm != (Object)null)) ? (((Component)this).transform.position + ((Component)this).transform.forward * 0.12f) : (((Component)firearm).transform.position + ((Component)firearm).transform.forward * 0.12f)); val2 = Quaternion.LookRotation((!((Object)(object)firearm != (Object)null)) ? ((Component)this).transform.forward : ((Component)firearm).transform.forward); } GameObject val3 = Object.Instantiate<GameObject>(prefab, val, val2); FVRFireArmRound component = val3.GetComponent<FVRFireArmRound>(); if ((Object)(object)component != (Object)null) { try { ((FVRPhysicalObject)component).SetIFF(GM.CurrentPlayerBody.GetPlayerIFF()); } catch { } } Rigidbody component2 = val3.GetComponent<Rigidbody>(); if ((Object)(object)component2 != (Object)null) { Transform val4; Vector3 val5; if (ejectDirection != Vector3.zero) { if (UseLocalEjectDirection) { val4 = (((Object)(object)ejectOrigin != (Object)null) ? ejectOrigin : ((!((Object)(object)firearm != (Object)null)) ? ((Component)this).transform : ((Component)firearm).transform)); val5 = val4.TransformDirection(((Vector3)(ref ejectDirection)).normalized); } else { val5 = ((Vector3)(ref ejectDirection)).normalized; val4 = (((Object)(object)ejectOrigin != (Object)null) ? ejectOrigin : ((!((Object)(object)firearm != (Object)null)) ? ((Component)this).transform : ((Component)firearm).transform)); } } else { val4 = (((Object)(object)ejectOrigin != (Object)null) ? ejectOrigin : ((!((Object)(object)firearm != (Object)null)) ? ((Component)this).transform : ((Component)firearm).transform)); val5 = val4.forward; } Vector3 val6 = val5; val6 = Quaternion.AngleAxis(Random.Range(0f - spreadAngle, spreadAngle), val4.up) * val6; val6 = Quaternion.AngleAxis(Random.Range(0f - spreadAngle, spreadAngle), val4.right) * val6; component2.AddForce(((Vector3)(ref val6)).normalized * ejectionForce, (ForceMode)2); } if (AudEvent_RoundEject != null) { SM.PlayGenericSound(AudEvent_RoundEject, val); } else { try { if ((Object)(object)firearm != (Object)null) { firearm.PlayAudioEvent((FirearmAudioEventType)29, 1f); } } catch { } } } if (perRoundSpawnDelay > 0f) { yield return (object)new WaitForSeconds(perRoundSpawnDelay); } else { yield return null; } } m_isEjecting = false; } private void SetAnimatedComponent(Transform t, Vector3 targetLocal, InterpStyle interp) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Invalid comparison between Unknown and I4 //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) //IL_0066: 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_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_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) if (!((Object)(object)t == (Object)null)) { m_animTransform = t; m_animInterp = interp; m_isAnimating = true; m_animT = 0f; if ((int)interp == 1) { m_animStartRot = t.localRotation; m_animTargetRot = Quaternion.Euler(targetLocal); } else { m_animStartPos = t.localPosition; m_animTargetPos = targetLocal; } } } private void Update() { //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Invalid comparison between Unknown and I4 //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: 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_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_004a: 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_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Invalid comparison between Unknown and I4 //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)ButtonTransform != (Object)null) { bool isEjecting = m_isEjecting; if (WasButtonHeldDown != isEjecting) { WasButtonHeldDown = isEjecting; Vector3 targetLocal = ((!WasButtonHeldDown) ? ButtonUnpressed : ButtonPressed); SetAnimatedComponent(ButtonTransform, targetLocal, ButtonInterp); } } if (!m_isAnimating || !((Object)(object)m_animTransform != (Object)null)) { return; } m_animT += Time.deltaTime * ButtonAnimSpeed; float num = Mathf.Clamp01(m_animT); if ((int)m_animInterp == 1) { m_animTransform.localRotation = Quaternion.Slerp(m_animStartRot, m_animTargetRot, num); } else { m_animTransform.localPosition = Vector3.Lerp(m_animStartPos, m_animTargetPos, num); } if (num >= 1f - Mathf.Epsilon) { if ((int)m_animInterp == 1) { m_animTransform.localRotation = m_animTargetRot; } else { m_animTransform.localPosition = m_animTargetPos; } m_isAnimating = false; m_animTransform = null; } } } public class ShotgunMagSwitcher : FVRInteractiveObject { public enum MagState { LeftMag, NoMag, RightMag } [Serializable] public class FauxMag { public FVRFireArmMagazine Mag; public Transform LowerPathForward; public Transform LowerPathRearward; public Transform TrigPoint; } [Serializable] public enum ManipulationType { None, Rotation, Translation } [Serializable] public enum Axis { X, Y, Z } [Serializable] public class SideSwitchAction { public ManipulationType Type = ManipulationType.Rotation; public Axis Axis = Axis.Z; [Tooltip("Degrees for Rotation; units for Translation.")] public float Value = 0f; [Tooltip("Apply to local space (true) or world space (false).")] public bool UseLocal = true; } public TubeFedShotgun Shotgun; public FVRFireArmMagazineReloadTrigger Trig; public Transform Switch; public List<FauxMag> FauxMags; public MagState CurState; public SideSwitchAction LeftAction = new SideSwitchAction { Type = ManipulationType.Rotation, Axis = Axis.Z, Value = -16f, UseLocal = true }; public SideSwitchAction RightAction = new SideSwitchAction { Type = ManipulationType.Rotation, Axis = Axis.Z, Value = 16f, UseLocal = true }; public override void SimpleInteraction(FVRViveHand hand) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) ((FVRInteractiveObject)this).SimpleInteraction(hand); if (Shotgun.CanCycleMagState()) { CycleSwitch(); ((FVRFireArm)Shotgun).PlayAudioAsHandling(((FVRFireArm)Shotgun).AudioClipSet.Safety, ((Component)this).transform.position); } } private void Awake() { if (CurState == MagState.NoMag) { CurState = MagState.LeftMag; } UpdateState(); } private void CycleSwitch() { if (CurState == MagState.LeftMag) { CurState = MagState.RightMag; } else { CurState = MagState.LeftMag; } UpdateState(); } private void UpdateState() { //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_02d3: Unknown result type (might be due to invalid IL or missing references) //IL_0315: Unknown result type (might be due to invalid IL or missing references) //IL_0357: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Shotgun == (Object)null) { Debug.LogWarning((object)"[ShotgunMagSwitcher] Shotgun reference is null. Assign in Inspector."); return; } if ((Object)(object)Trig == (Object)null) { Debug.LogWarning((object)"[ShotgunMagSwitcher] Trig reference is null. Assign in Inspector."); return; } if (FauxMags == null || FauxMags.Count < 2) { Debug.LogWarning((object)"[ShotgunMagSwitcher] FauxMags must contain at least 2 entries (left/right)."); return; } switch (CurState) { case MagState.LeftMag: if (FauxMags[0] == null || (Object)(object)FauxMags[0].Mag == (Object)null) { Debug.LogWarning((object)"[ShotgunMagSwitcher] Left FauxMag or its Mag is null."); break; } ((FVRFireArm)Shotgun).Magazine = FauxMags[0].Mag; Trig.Magazine = FauxMags[0].Mag; ((Component)Trig).gameObject.SetActive(true); if ((Object)(object)FauxMags[0].LowerPathForward != (Object)null) { Shotgun.RoundPos_LowerPath_Forward.position = FauxMags[0].LowerPathForward.position; } if ((Object)(object)FauxMags[0].LowerPathRearward != (Object)null) { Shotgun.RoundPos_LowerPath_Rearward.position = FauxMags[0].LowerPathRearward.position; } if ((Object)(object)FauxMags[0].TrigPoint != (Object)null) { ((Component)Trig).transform.position = FauxMags[0].TrigPoint.position; } ApplySideAction(LeftAction); break; case MagState.NoMag: ((FVRFireArm)Shotgun).Magazine = null; ((Component)Trig).gameObject.SetActive(false); ApplySideAction(null); break; case MagState.RightMag: if (FauxMags[1] == null || (Object)(object)FauxMags[1].Mag == (Object)null) { Debug.LogWarning((object)"[ShotgunMagSwitcher] Right FauxMag or its Mag is null."); break; } ((FVRFireArm)Shotgun).Magazine = FauxMags[1].Mag; Trig.Magazine = FauxMags[1].Mag; ((Component)Trig).gameObject.SetActive(true); if ((Object)(object)FauxMags[1].LowerPathForward != (Object)null) { Shotgun.RoundPos_LowerPath_Forward.position = FauxMags[1].LowerPathForward.position; } if ((Object)(object)FauxMags[1].LowerPathRearward != (Object)null) { Shotgun.RoundPos_LowerPath_Rearward.position = FauxMags[1].LowerPathRearward.position; } if ((Object)(object)FauxMags[1].TrigPoint != (Object)null) { ((Component)Trig).transform.position = FauxMags[1].TrigPoint.position; } ApplySideAction(RightAction); break; } } private void ApplySideAction(SideSwitchAction action) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_0252: 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) if ((Object)(object)Switch == (Object)null) { return; } if (action == null || action.Type == ManipulationType.None) { Switch.localEulerAngles = Vector3.zero; Switch.localPosition = Vector3.zero; } else if (action.Type == ManipulationType.Rotation) { if (action.UseLocal) { Vector3 localEulerAngles = Switch.localEulerAngles; switch (action.Axis) { case Axis.X: localEulerAngles.x = action.Value; break; case Axis.Y: localEulerAngles.y = action.Value; break; case Axis.Z: localEulerAngles.z = action.Value; break; } Switch.localEulerAngles = localEulerAngles; } else { Vector3 eulerAngles = Switch.eulerAngles; switch (action.Axis) { case Axis.X: eulerAngles.x = action.Value; break; case Axis.Y: eulerAngles.y = action.Value; break; case Axis.Z: eulerAngles.z = action.Value; break; } Switch.eulerAngles = eulerAngles; } } else { if (action.Type != ManipulationType.Translation) { return; } if (action.UseLocal) { Vector3 localPosition = Switch.localPosition; switch (action.Axis) { case Axis.X: localPosition.x = action.Value; break; case Axis.Y: localPosition.y = action.Value; break; case Axis.Z: localPosition.z = action.Value; break; } Switch.localPosition = localPosition; } else { Vector3 position = Switch.position; switch (action.Axis) { case Axis.X: position.x = action.Value; break; case Axis.Y: position.y = action.Value; break; case Axis.Z: position.z = action.Value; break; } Switch.position = position; } } } } public class OpenBoltSafety : OpenBoltSecondarySelectorSwitch { private class BoltGuard { public OpenBoltReceiverBolt Bolt; public FieldInfo FI_m_boltZ_current; public FieldInfo FI_m_boltZ_heldTarget; public FieldInfo FI_m_curBoltSpeed; public FieldInfo FI_m_isChargingHandleHeld; public bool IsBlocked; public float BlockedZ; } [Tooltip("When true the selector will prevent bolt Z movement while leaving the bolt component enabled (grabs/sounds still work).")] public bool preventBoltMovementWhenSafe = true; private readonly List<BoltGuard> _guards = new List<BoltGuard>(); public void Awake() { ((OpenBoltSecondarySelectorSwitch)this).Awake(); RefreshGuards(); UpdateBoltBlockState(); } public override void SimpleInteraction(FVRViveHand hand) { ((OpenBoltSecondarySelectorSwitch)this).SimpleInteraction(hand); RefreshGuards(); UpdateBoltBlockState(); } private void RefreshGuards() { _guards.Clear(); OpenBoltReceiver gun = base.Gun; if ((Object)(object)gun == (Object)null) { return; } OpenBoltReceiverBolt[] componentsInChildren = ((Component)gun).GetComponentsInChildren<OpenBoltReceiverBolt>(true); if (componentsInChildren == null || componentsInChildren.Length == 0) { return; } OpenBoltReceiverBolt[] array = componentsInChildren; foreach (OpenBoltReceiverBolt val in array) { if (!((Object)(object)val == (Object)null)) { Type type = ((object)val).GetType(); FieldInfo field = type.GetField("m_boltZ_current", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field2 = type.GetField("m_boltZ_heldTarget", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field3 = type.GetField("m_curBoltSpeed", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field4 = type.GetField("m_isChargingHandleHeld", BindingFlags.Instance | BindingFlags.NonPublic); _guards.Add(new BoltGuard { Bolt = val, FI_m_boltZ_current = field, FI_m_boltZ_heldTarget = field2, FI_m_curBoltSpeed = field3, FI_m_isChargingHandleHeld = field4, IsBlocked = false, BlockedZ = float.NaN }); } } } public void UpdateBoltBlockState() { //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Invalid comparison between Unknown and I4 bool flag = false; if (base.Modes != null && base.CurModeIndex >= 0 && base.CurModeIndex < base.Modes.Length) { try { flag = (int)base.Modes[base.CurModeIndex].ModeType == 0; } catch { flag = false; } } if (!preventBoltMovementWhenSafe) { foreach (BoltGuard guard in _guards) { if (guard != null) { guard.IsBlocked = false; } } return; } if (_guards.Count == 0) { RefreshGuards(); } if (_guards.Count == 0) { return; } foreach (BoltGuard guard2 in _guards) { if (guard2 == null || (Object)(object)guard2.Bolt == (Object)null) { continue; } if (flag) { if (guard2.IsBlocked) { continue; } float num = float.NaN; try { if ((object)guard2.FI_m_boltZ_current != null) { object value = guard2.FI_m_boltZ_current.GetValue(guard2.Bolt); if (value is float) { num = (float)value; } } } catch { num = float.NaN; } if (float.IsNaN(num)) { num = ((Component)guard2.Bolt).transform.localPosition.z; } guard2.BlockedZ = num; try { if ((object)guard2.FI_m_curBoltSpeed != null) { guard2.FI_m_curBoltSpeed.SetValue(guard2.Bolt, 0f); } } catch { } try { if ((object)guard2.FI_m_boltZ_heldTarget != null) { guard2.FI_m_boltZ_heldTarget.SetValue(guard2.Bolt, guard2.BlockedZ); } } catch { } try { if ((object)guard2.FI_m_isChargingHandleHeld != null) { guard2.FI_m_isChargingHandleHeld.SetValue(guard2.Bolt, false); } } catch { } guard2.IsBlocked = true; } else if (guard2.IsBlocked) { guard2.IsBlocked = false; } } } private void Update() { //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) if (!preventBoltMovementWhenSafe || _guards.Count == 0) { return; } foreach (BoltGuard guard in _guards) { if (guard == null || (Object)(object)guard.Bolt == (Object)null || !guard.IsBlocked) { continue; } try { if ((object)guard.FI_m_boltZ_current != null) { guard.FI_m_boltZ_current.SetValue(guard.Bolt, guard.BlockedZ); } } catch { } try { if ((object)guard.FI_m_curBoltSpeed != null) { guard.FI_m_curBoltSpeed.SetValue(guard.Bolt, 0f); } } catch { } try { if ((object)guard.FI_m_boltZ_heldTarget != null) { guard.FI_m_boltZ_heldTarget.SetValue(guard.Bolt, guard.BlockedZ); } } catch { } try { Transform transform = ((Component)guard.Bolt).transform; Vector3 localPosition = transform.localPosition; if (Mathf.Abs(localPosition.z - guard.BlockedZ) > Mathf.Epsilon) { transform.localPosition = new Vector3(localPosition.x, localPosition.y, guard.BlockedZ); } } catch { } } } private void LateUpdate() { //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: 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) if (!preventBoltMovementWhenSafe || _guards.Count == 0) { return; } foreach (BoltGuard guard in _guards) { if (guard == null || (Object)(object)guard.Bolt == (Object)null || !guard.IsBlocked) { continue; } try { if ((object)guard.FI_m_boltZ_current != null) { guard.FI_m_boltZ_current.SetValue(guard.Bolt, guard.BlockedZ); } } catch { } try { if ((object)guard.FI_m_curBoltSpeed != null) { guard.FI_m_curBoltSpeed.SetValue(guard.Bolt, 0f); } } catch { } try { Transform transform = ((Component)guard.Bolt).transform; Vector3 localPosition = transform.localPosition; if (Mathf.Abs(localPosition.z - guard.BlockedZ) > Mathf.Epsilon) { transform.localPosition = new Vector3(localPosition.x, localPosition.y, guard.BlockedZ); } } catch { } } } } namespace Volks.762Tokarev_Additional; [BepInPlugin("Volks.762Tokarev_Additional", "762Tokarev_Additional", "1.0.0")] [BepInProcess("h3vr.exe")] [Description("Built with MeatKit")] [BepInDependency("h3vr.otherloader", "1.3.0")] public class 762Tokarev_AdditionalPlugin : 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.762Tokarev_Additional"); OtherLoader.RegisterDirectLoad(BasePath, "Volks.762Tokarev_Additional", "", "", "762tokarev_additional", ""); } } public class PhysicalSlideLock : FVRInteractiveObject { [Header("Target Handgun")] public Handgun Weapon; [Header("Visual Switch")] public Transform LockSwitch; public InterpStyle InterpStyle = (InterpStyle)1; public Axis Axis = (Axis)2; public float LockedPos = 1f; public float UnlockedPos = 0f; [Header("Audio")] public bool PlaySoundOnToggle = true; public AudioEvent AudEvent_Toggle; public bool UseDeniedSound = true; public AudioEvent AudEvent_Denied; private MethodInfo miEngage; private MethodInfo miDisengage; public override void Awake() { ((FVRInteractiveObject)this).Awake(); CacheReflection(); if ((Object)(object)Weapon != (Object)null) { UpdateVisual(Weapon.IsSLideLockMechanismEngaged); } } private void CacheReflection() { if (!((Object)(object)Weapon == (Object)null)) { Type typeFromHandle = typeof(Handgun); miEngage = typeFromHandle.GetMethod("EngageSlideLockMechanism", BindingFlags.Instance | BindingFlags.NonPublic); miDisengage = typeFromHandle.GetMethod("DisEngageSlideLockMechanism", BindingFlags.Instance | BindingFlags.NonPublic); } } public override void FVRUpdate() { ((FVRInteractiveObject)this).FVRUpdate(); if ((Object)(object)Weapon != (Object)null && (Object)(object)LockSwitch != (Object)null) { UpdateVisual(Weapon.IsSLideLockMechanismEngaged); } } public override void SimpleInteraction(FVRViveHand hand) { ((FVRInteractiveObject)this).SimpleInteraction(hand); ToggleLock(); } private void ToggleLock() { //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Weapon == (Object)null) { return; } if ((object)miEngage == null || (object)miDisengage == null) { CacheReflection(); } if (!Weapon.IsSLideLockMechanismEngaged) { if ((Object)(object)Weapon.Slide == (Object)null) { PlayDeniedSound(); return; } bool flag = false; float num = -1f; try { if ((int)Weapon.Slide.CurPos == 0) { flag = true; } else { num = Weapon.Slide.GetSlideLerpBetweenLockAndFore(); if (num >= 0.9f) { flag = true; } else { try { float z = ((Component)Weapon.Slide).transform.localPosition.z; float z2 = Weapon.Slide.Point_Slide_Forward.localPosition.z; if (Mathf.Abs(z - z2) <= 0.0015f) { flag = true; } } catch { } } } } catch (Exception) { } if (!flag) { PlayDeniedSound(); return; } if ((object)miEngage != null) { try { miEngage.Invoke(Weapon, null); UpdateVisual(Weapon.IsSLideLockMechanismEngaged); PlayToggleSound(); return; } catch (Exception) { PlayDeniedSound(); return; } } PlayDeniedSound(); return; } if ((object)miDisengage != null) { try { miDisengage.Invoke(Weapon, null); UpdateVisual(Weapon.IsSLideLockMechanismEngaged); PlayToggleSound(); return; } catch (Exception) { PlayDeniedSound(); return; } } PlayDeniedSound(); } private void PlayToggleSound() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) if (PlaySoundOnToggle && AudEvent_Toggle != null && !((Object)(object)Weapon == (Object)null)) { ((FVRFireArm)Weapon).PlayAudioAsHandling(AudEvent_Toggle, ((Component)this).transform.position); } } private void PlayDeniedSound() { //IL_004a: Unknown result type (might be due to invalid IL or missing references) if (PlaySoundOnToggle && UseDeniedSound && AudEvent_Denied != null && !((Object)(object)Weapon == (Object)null)) { ((FVRFireArm)Weapon).PlayAudioAsHandling(AudEvent_Denied, ((Component)this).transform.position); } } private void UpdateVisual(bool locked) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)LockSwitch == (Object)null) && !((Object)(object)Weapon == (Object)null)) { float num = ((!locked) ? UnlockedPos : LockedPos); ((FVRPhysicalObject)Weapon).SetAnimatedComponent(LockSwitch, num, InterpStyle, Axis); } } } public class ThermalOverlayWithZoomDisplay : PIPScopeGUIDrawer { public PIPScopeController ScopeController; public Canvas OverlayCanvas; public Text ZoomText; public Material OverlayMaterial; public Texture2D OverlayTexture; public Color OverlayColor = Color.white; public float UpdateInterval = 0.1f; private float nextUpdateTime = 0f; private int lastThermalZoomIndex = -1; public override void DrawGUI(PIPScope scope, Canvas canvas, Vector2 canvasSize) { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) if (scope.enableThermal) { if ((Object)(object)OverlayMaterial != (Object)null && (Object)(object)OverlayTexture != (Object)null) { OverlayMaterial.mainTexture = (Texture)(object)OverlayTexture; OverlayMaterial.color = OverlayColor; OverlayMaterial.SetPass(0); Rect val = default(Rect); ((Rect)(ref val))..ctor(0f, 0f, canvasSize.x, canvasSize.y); GUI.DrawTexture(val, (Texture)(object)OverlayTexture); } UpdateZoomLevelDisplay(); } } private void UpdateZoomLevelDisplay() { if (Time.time < nextUpdateTime) { return; } nextUpdateTime = Time.time + UpdateInterval; if ((Object)(object)ScopeController == (Object)null || (Object)(object)ZoomText == (Object)null) { Debug.LogWarning((object)"ThermalOverlayWithZoomDisplay: Missing necessary references!"); return; } int thermalZoomIndex = ScopeController.ThermalZoomIndex; if (lastThermalZoomIndex != thermalZoomIndex) { lastThermalZoomIndex = thermalZoomIndex; if (ScopeController.ThermalDigitalZoomMagnifications != null && thermalZoomIndex >= 0 && thermalZoomIndex < ScopeController.ThermalDigitalZoomMagnifications.Count) { float num = ScopeController.ThermalDigitalZoomMagnifications[thermalZoomIndex]; ZoomText.text = $"Zoom Level: {num:F1}x"; } else { ZoomText.text = "Zoom Level: N/A"; } } } } public class BeltPhysic : MonoBehaviour { public enum SwingPlane { AnchorForward, AnchorUp, AnchorRight, Custom } [Header("References")] [Tooltip("Prefab for a single link (should include round/bullet visual as a child).")] public GameObject BeltLinkPrefab; [Tooltip("Feed point - node 0 is pinned here")] public Transform Anchor; [Tooltip("Optional override for anchor")] public Transform StartAnchorOverride; [Header("Belt sizing")] public int MaxLinks = 50; public float LinkSpacing = 0.04f; public bool AutoSyncMagazine = true; public FVRFireArmMagazine Magazine; public int ManualRounds = 10; public bool ClampToMagazineCapacity = true; [Header("Physics")] public float Gravity = 9.8f; [Range(0f, 1f)] public float Damping = 0.98f; public int Iterations = 6; [Tooltip("Max angle (deg) between adjacent links; helps avoid sharp kinks.")] public float MaxBendAngle = 45f; [Header("Flap / Plane")] [Tooltip("Which axis/plane the belt should flap on.")] public SwingPlane PlaneChoice = SwingPlane.AnchorForward; [Tooltip("When PlaneChoice==Custom, this world normal is used.")] public Vector3 CustomPlaneNormal = Vector3.forward; [Tooltip("If true the belt is constrained to the chosen plane (left/right flap).")] public bool ConstrainToPlane = true; [Header("Visuals")] public Vector3 LinkRotationOffset = Vector3.zero; private List<GameObject> _pool = new List<GameObject>(); private Vector3[] _pos; private Vector3[] _old; private int _activeLinks; private bool _initialized = false; private void Awake() { _pos = (Vector3[])(object)new Vector3[MaxLinks]; _old = (Vector3[])(object)new Vector3[MaxLinks]; for (int i = 0; i < MaxLinks; i++) { GameObject val = null; if ((Object)(object)BeltLinkPrefab != (Object)null) { val = Object.Instantiate<GameObject>(BeltLinkPrefab, ((Component)this).transform); val.SetActive(false); } _pool.Add(val); } } private void Start() { int roundCount = GetRoundCount(); Rebuild(roundCount); Paint(); _initialized = true; } private void FixedUpdate() { Transform anchor = GetAnchor(); if ((Object)(object)anchor == (Object)null) { return; } int roundCount = GetRoundCount(); if (roundCount <= 0) { Object.Destroy((Object)(object)((Component)this).gameObject); return; } if (!_initialized) { Rebuild(roundCount); _initialized = true; } else if (roundCount != _activeLinks) { Resize(roundCount); } Simulate(anchor, Time.fixedDeltaTime); Paint(); } private Transform GetAnchor() { return (!((Object)(object)StartAnchorOverride != (Object)null)) ? Anchor : StartAnchorOverride; } private int GetRoundCount() { if (AutoSyncMagazine && (Object)(object)Magazine != (Object)null) { int num = Magazine.m_numRounds; if (ClampToMagazineCapacity) { num = Mathf.Min(num, Magazine.m_capacity); } return Mathf.Clamp(num, 0, MaxLinks); } return Mathf.Clamp(ManualRounds, 0, MaxLinks); } private void Rebuild(int count) { //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: 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_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: 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) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: 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) Transform anchor = GetAnchor(); if ((Object)(object)anchor == (Object)null) { return; } for (int i = count; i < _pool.Count; i++) { if ((Object)(object)_pool[i] != (Object)null) { _pool[i].SetActive(false); } } _activeLinks = Mathf.Clamp(count, 0, MaxLinks); Vector3 right = anchor.right; if (((Vector3)(ref right)).sqrMagnitude < 1E-06f) { right = Vector3.right; } for (int j = 0; j < _activeLinks; j++) { Vector3 val = anchor.position + right * ((float)j * LinkSpacing) + Vector3.down * ((float)j * LinkSpacing * 0.05f); _pos[j] = val; _old[j] = val; } } private void Resize(int targetLinks) { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: 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) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: 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_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_0101: 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_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_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) targetLinks = Mathf.Clamp(targetLinks, 0, MaxLinks); if (targetLinks == _activeLinks) { return; } if (targetLinks > _activeLinks) { if (_activeLinks == 0) { Rebuild(targetLinks); return; } for (int i = _activeLinks; i < targetLinks; i++) { Vector3 val = _pos[i - 1] - _pos[i - 2]; Vector3 val2 = ((Vector3)(ref val)).normalized; if (i == 1) { Vector3 val3 = _pos[0] - GetAnchor().position; val2 = ((Vector3)(ref val3)).normalized; } if (((Vector3)(ref val2)).sqrMagnitude < 1E-06f) { val2 = Vector3.down; } Vector3 val4 = _pos[i - 1] + val2 * LinkSpacing; _pos[i] = val4; _old[i] = val4; } } else { for (int j = targetLinks; j < _activeLinks; j++) { if ((Object)(object)_pool[j] != (Object)null) { _pool[j].SetActive(false); } } } _activeLinks = targetLinks; } private void Simulate(Transform a, float dt) { //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_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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) //IL_0047: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: 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_0079: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: 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_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: 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) //IL_010c: 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_0150: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_017f: 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_0189: 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_01f1: Unknown result type (might be due to invalid IL or missing references) //IL_01f6: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_020f: 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_0227: 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_022e: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: 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_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_044c: Unknown result type (might be due to invalid IL or missing references) //IL_044d: Unknown result type (might be due to invalid IL or missing references) //IL_0276: Unknown result type (might be due to invalid IL or missing references) //IL_028a: Unknown result type (might be due to invalid IL or missing references) //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_02b7: Unknown result type (might be due to invalid IL or missing references) //IL_02bc: Unknown result type (might be due to invalid IL or missing references) //IL_02c1: Unknown result type (might be due to invalid IL or missing references) //IL_03ed: Unknown result type (might be due to invalid IL or missing references) //IL_03f2: Unknown result type (might be due to invalid IL or missing references) //IL_03f3: Unknown result type (might be due to invalid IL or missing references) //IL_03f8: Unknown result type (might be due to invalid IL or missing references) //IL_03fa: Unknown result type (might be due to invalid IL or missing references) //IL_03fc: 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_0418: Unknown result type (might be due to invalid IL or missing references) //IL_041c: Unknown result type (might be due to invalid IL or missing references) //IL_0421: Unknown result type (might be due to invalid IL or missing references) //IL_0426: Unknown result type (might be due to invalid IL or missing references) //IL_02f2: Unknown result type (might be due to invalid IL or missing references) //IL_02f6: Unknown result type (might be due to invalid IL or missing references) //IL_02fb: Unknown result type (might be due to invalid IL or missing references) //IL_02fd: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Unknown result type (might be due to invalid IL or missing references) //IL_0306: Unknown result type (might be due to invalid IL or missing references) //IL_0308: Unknown result type (might be due to invalid IL or missing references) //IL_030a: Unknown result type (might be due to invalid IL or missing references) //IL_0343: Unknown result type (might be due to invalid IL or missing references) //IL_0345: 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_034c: Unknown result type (might be due to invalid IL or missing references) //IL_036f: Unknown result type (might be due to invalid IL or missing references) //IL_0374: Unknown result type (might be due to invalid IL or missing references) //IL_0379: Unknown result type (might be due to invalid IL or missing references) //IL_0397: 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_039e: Unknown result type (might be due to invalid IL or missing references) //IL_03a0: 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_03b1: Unknown result type (might be due to invalid IL or missing references) if (_activeLinks <= 0) { return; } Vector3 position = a.position; Vector3 val = Vector3.down * (Gravity * dt * dt); for (int i = 1; i < _activeLinks; i++) { Vector3 val2 = _pos[i]; Vector3 val3 = (val2 - _old[i]) * Damping; _old[i] = val2; ref Vector3 reference = ref _pos[i]; reference = val2 + val3 + val; } Vector3 val4; if (ConstrainToPlane) { switch (PlaneChoice) { case SwingPlane.AnchorForward: val4 = a.forward; break; case SwingPlane.AnchorUp: val4 = a.up; break; case SwingPlane.AnchorRight: val4 = a.right; break; default: val4 = ((Vector3)(ref CustomPlaneNormal)).normalized; if (((Vector3)(ref val4)).sqrMagnitude < 1E-06f) { val4 = Vector3.forward; } break; } } else { val4 = Vector3.zero; } for (int j = 0; j < Iterations; j++) { _pos[0] = position; for (int k = 1; k < _activeLinks; k++) { Vector3 val5 = _pos[k] - _pos[k - 1]; float magnitude = ((Vector3)(ref val5)).magnitude; if (!(magnitude < 1E-06f)) { float num = (magnitude - LinkSpacing) / magnitude; if (k == 1) { ref Vector3 reference2 = ref _pos[k]; reference2 -= val5 * num; continue; } Vector3 val6 = val5 * (num * 0.5f); ref Vector3 reference3 = ref _pos[k - 1]; reference3 += val6; ref Vector3 reference4 = ref _pos[k]; reference4 -= val6; } } if (MaxBendAngle < 179f) { for (int l = 2; l < _activeLinks; l++) { Vector3 val7 = _pos[l - 1] - _pos[l - 2]; Vector3 val8 = _pos[l] - _pos[l - 1]; float magnitude2 = ((Vector3)(ref val7)).magnitude; float magnitude3 = ((Vector3)(ref val8)).magnitude; if (magnitude2 < 1E-06f || magnitude3 < 1E-06f) { continue; } Vector3 val9 = val7 / magnitude2; Vector3 val10 = val8 / magnitude3; float num2 = Mathf.Clamp(Vector3.Dot(val9, val10), -1f, 1f); float num3 = Mathf.Acos(num2) * 57.29578f; if (!(num3 <= MaxBendAngle)) { Vector3 val11 = Vector3.Cross(val9, val10); if (!(((Vector3)(ref val11)).sqrMagnitude < 1E-08f)) { Quaternion val12 = Quaternion.AngleAxis(num3 - MaxBendAngle, ((Vector3)(ref val11)).normalized); ref Vector3 reference5 = ref _pos[l]; reference5 = _pos[l - 1] + val12 * val10 * magnitude3; } } } } if (ConstrainToPlane) { for (int m = 1; m < _activeLinks; m++) { Vector3 val13 = _pos[m] - position; float num4 = Vector3.Dot(val13, val4); ref Vector3 reference6 = ref _pos[m]; reference6 -= val4 * num4; } } _pos[0] = position; } } private void Paint() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: 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) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: 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_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: 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_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0243: 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) Transform anchor = GetAnchor(); if ((Object)(object)anchor == (Object)null) { return; } Vector3 up = anchor.up; for (int i = 0; i < _pool.Count; i++) { if (i >= _activeLinks) { if ((Object)(object)_pool[i] != (Object)null) { _pool[i].SetActive(false); } continue; } GameObject val = _pool[i]; if ((Object)(object)val == (Object)null) { continue; } val.SetActive(true); Vector3 val2 = ((i < _activeLinks - 1) ? (_pos[i + 1] - _pos[i]) : ((i <= 0) ? anchor.forward : (_pos[i] - _pos[i - 1]))); if (((Vector3)(ref val2)).sqrMagnitude < 1E-06f) { val2 = anchor.forward; } ((Vector3)(ref val2)).Normalize(); Vector3 val3 = Vector3.ProjectOnPlane(up, val2); Vector3 val4 = ((Vector3)(ref val3)).normalized; if (((Vector3)(ref val4)).sqrMagnitude < 1E-06f) { val4 = Vector3.up; } val.transform.position = _pos[i]; val.transform.rotation = Quaternion.LookRotation(val2, val4) * Quaternion.Euler(LinkRotationOffset); Transform val5 = val.transform.Find("Round"); if ((Object)(object)val5 == (Object)null) { val5 = val.transform.Find("Bullet"); } if ((Object)(object)val5 == (Object)null) { MeshRenderer[] componentsInChildren = val.GetComponentsInChildren<MeshRenderer>(true); MeshRenderer[] array = componentsInChildren; foreach (MeshRenderer val6 in array) { if ((Object)(object)val6 != (Object)null && (Object)(object)((Component)val6).transform != (Object)(object)val.transform) { val5 = ((Component)val6).transform; break; } } } if ((Object)(object)val5 != (Object)null) { val5.localPosition = Vector3.zero; val5.localRotation = Quaternion.identity; } } } } public class ManualEjectorRod : FVRInteractiveObject { [Header("Ejector Rod Points")] public Transform Point_Rod_Rest; public Transform Point_Rod_FullyOut; public Transform Point_Rod_Eject; public Transform Point_Rod_Closed; [Header("Spring Visual")] public Transform SpringObject; public Vector3 SpringScale_Rest = Vector3.one; public Vector3 SpringScale_FullyOut = new Vector3(1f, 1f, 0.5f); [Header("Revolver Reference")] public SingleActionRevolver Revolver; private float m_rodZ_rest; private float m_rodZ_out; private float m_rodZ_eject; private float m_rodZ_closed; private float m_rodZ_current; private float m_rodZ_heldTarget; public override void Awake() { //IL_000e: 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_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: 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_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) ((FVRInteractiveObject)this).Awake(); m_rodZ_rest = Point_Rod_Rest.localPosition.z; m_rodZ_out = Point_Rod_FullyOut.localPosition.z; m_rodZ_current = m_rodZ_rest; m_rodZ_eject = Point_Rod_Eject.localPosition.z; m_rodZ_closed = Point_Rod_Closed.localPosition.z; } public override void BeginInteraction(FVRViveHand hand) { ((FVRInteractiveObject)this).BeginInteraction(hand); } public override void UpdateInteraction(FVRViveHand hand) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) ((FVRInteractiveObject)this).UpdateInteraction(hand); Vector3 closestValidPoint = GetClosestValidPoint(Point_Rod_Rest.position, Point_Rod_FullyOut.position, ((HandInput)(ref hand.Input)).Pos); m_rodZ_heldTarget = ((Component)this).transform.parent.InverseTransformPoint(closestValidPoint).z; float num = Mathf.Min(m_rodZ_rest, m_rodZ_out); float num2 = Mathf.Max(m_rodZ_rest, m_rodZ_out); if ((Object)(object)Revolver != (Object)null && !Revolver.m_isStateToggled) { if (m_rodZ_rest < m_rodZ_out) { num2 = Mathf.Min(num2, m_rodZ_closed); } else { num = Mathf.Max(num, m_rodZ_closed); } } m_rodZ_current = Mathf.Clamp(m_rodZ_heldTarget, num, num2); Vector3 localPosition = ((Component)this).transform.localPosition; localPosition.z = m_rodZ_current; ((Component)this).transform.localPosition = localPosition; if ((Object)(object)SpringObject != (Object)null) { float num3 = Mathf.InverseLerp(m_rodZ_rest, m_rodZ_out, m_rodZ_current); SpringObject.localScale = Vector3.Lerp(SpringScale_Rest, SpringScale_FullyOut, num3); } if ((Object)(object)Revolver != (Object)null && Revolver.m_isStateToggled && ((!(m_rodZ_rest < m_rodZ_out)) ? (m_rodZ_current <= m_rodZ_eject) : (m_rodZ_current >= m_rodZ_eject))) { Revolver.EjectPrevCylinder(); } } public override void EndInteraction(FVRViveHand hand) { //IL_000e: 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_0027: Unknown result type (might be due to invalid IL or missing references) ((FVRInteractiveObject)this).EndInteraction(hand); Vector3 localPosition = ((Component)this).transform.localPosition; localPosition.z = m_rodZ_rest; ((Component)this).transform.localPosition = localPosition; } private Vector3 GetClosestValidPoint(Vector3 a, Vector3 b, Vector3 point) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) Vector3 val = b - a; float num = Vector3.Dot(point - a, ((Vector3)(ref val)).normalized) / ((Vector3)(ref val)).magnitude; num = Mathf.Clamp01(num); return a + val * num; } public void AnimateEject() { ((MonoBehaviour)this).StartCoroutine(AnimateEjectRoutine()); } private IEnumerator AnimateEjectRoutine() { float duration = 0.15f; float t2 = 0f; Vector3 localPos = ((Component)this).transform.localPosition; float startZ = m_rodZ_rest; float endZ = m_rodZ_eject; while (t2 < duration) { t2 += Time.deltaTime; float lerp = Mathf.Clamp01(t2 / duration); localPos.z = Mathf.Lerp(startZ, endZ, lerp); ((Component)this).transform.localPosition = localPos; yield return null; } localPos.z = endZ; ((Component)this).transform.localPosition = localPos; if ((Object)(object)Revolver != (Object)null && Revolver.m_isStateToggled) { Revolver.EjectPrevCylinder(); } t2 = 0f; while (t2 < duration) { t2 += Time.deltaTime; float lerp2 = Mathf.Clamp01(t2 / duration); localPos.z = Mathf.Lerp(endZ, startZ, lerp2); ((Component)this).transform.localPosition = localPos; yield return null; } localPos.z = startZ; ((Component)this).transform.localPosition = localPos; } } public class SARotatingCylinder : FVRInteractiveObject { [Header("References")] public SingleActionRevolver Revolver; public ManualEjectorRod EjectorRod; [Header("Rotation Settings")] public float SnapSpeed = 12f; public float RotationThreshold = 15f; [Header("Cylinder Direction")] public bool RotateClockwise = true; private int m_lastChamber = -1; private float m_lastAngle = 0f; private bool m_isProxyHoldingRevolver = false; private SingleActionRevolverCylinder Cylinder => (!((Object)(object)Revolver != (Object)null)) ? null : Revolver.Cylinder; private int GetAccessibleChamber() { return (!Revolver.IsAccessTwoChambersBack) ? Revolver.PrevChamber : Revolver.PrevChamber2; } public override void BeginInteraction(FVRViveHand hand) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) ((FVRInteractiveObject)this).BeginInteraction(hand); if (!((Object)(object)Cylinder == (Object)null)) { Vector3 val = ((HandInput)(ref hand.Input)).Pos - ((Component)this).transform.position; m_lastAngle = Mathf.Atan2(val.y, val.x) * 57.29578f; if ((Object)(object)Revolver != (Object)null && !((FVRInteractiveObject)Revolver).IsHeld) { ((FVRInteractiveObject)Revolver).BeginInteraction(hand); m_isProxyHoldingRevolver = true; } } } public override void UpdateInteraction(FVRViveHand hand) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_019a: 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_01ad: 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) ((FVRInteractiveObject)this).UpdateInteraction(hand); if ((Object)(object)Cylinder == (Object)null || (Object)(object)Revolver == (Object)null || !Revolver.m_isStateToggled) { return; } Vector3 val = ((HandInput)(ref hand.Input)).Pos - ((Component)this).transform.position; float num = Mathf.Atan2(val.y, val.x) * 57.29578f; float num2 = Mathf.DeltaAngle(m_lastAngle, num); if (base.m_isHeld && Mathf.Abs(num2) > RotationThreshold) { int num3 = (RotateClockwise ? 1 : (-1)); int accessibleChamber = GetAccessibleChamber(); int curChamber = (accessibleChamber + num3 + Cylinder.NumChambers) % Cylinder.NumChambers; Revolver.CurChamber = curChamber; m_lastChamber = Revolver.CurChamber; m_lastAngle = num; ((Component)this).transform.localRotation = Cylinder.GetLocalRotationFromCylinder(Revolver.CurChamber); ((FVRFireArm)Revolver).PlayAudioEvent((FirearmAudioEventType)15, 1f); if (hand.Input.TriggerDown && (Object)(object)EjectorRod != (Object)null) { EjectorRod.AnimateEject(); } } else { int accessibleChamber2 = GetAccessibleChamber(); Revolver.CurChamber = accessibleChamber2; Quaternion localRotationFromCylinder = Cylinder.GetLocalRotationFromCylinder(accessibleChamber2); ((Component)this).transform.localRotation = Quaternion.Slerp(((Component)this).transform.localRotation, localRotationFromCylinder, Time.deltaTime * SnapSpeed); if (accessibleChamber2 != m_lastChamber) { m_lastChamber = accessibleChamber2; } } } public override void EndInteraction(FVRViveHand hand) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) ((FVRInteractiveObject)this).EndInteraction(hand); if ((Object)(object)Cylinder != (Object)null && (Object)(object)Revolver != (Object)null) { int accessibleChamber = GetAccessibleChamber(); Revolver.CurChamber = accessibleChamber; ((Component)this).transform.localRotation = Cylinder.GetLocalRotationFromCylinder(accessibleChamber); } if (m_isProxyHoldingRevolver && (Object)(object)Revolver != (Object)null && ((FVRInteractiveObject)Revolver).IsHeld) { ((FVRInteractiveObject)Revolver).EndInteraction(hand); m_isProxyHoldingRevolver = false; } } } public class EjectionFollow : MonoBehaviour { [Header("Open Bolt Weapon Config")] public OpenBoltReceiver FireArm; public Transform EjectionPortTransform; public Vector3 LocalEjectionSpeed = new Vector3(1f, 0f, 0f); public Vector3 LocalEjectionSpin = Vector3.zero; private void LateUpdate() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: 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_009a: Unknown result type (might be due to invalid IL or missing references) //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) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)FireArm == (Object)null) && !((Object)(object)EjectionPortTransform == (Object)null)) { FireArm.EjectionSpeed = EjectionPortTransform.right * LocalEjectionSpeed.x + EjectionPortTransform.up * LocalEjectionSpeed.y + EjectionPortTransform.forward * LocalEjectionSpeed.z; FireArm.EjectionSpin = EjectionPortTransform.right * LocalEjectionSpin.x + EjectionPortTransform.up * LocalEjectionSpin.y + EjectionPortTransform.forward * LocalEjectionSpin.z; } } } public class OneHandedFiring : MonoBehaviour { public FVRFireArm Firearm; public bool ForegripWhenShouldered = true; public float StabilizeDistance = 0.22f; private FVRAlternateGrip _dummyAltGrip; private void Update() { //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Firearm == (Object)null) { return; } bool flag = false; if ((Object)(object)Firearm.StockPos != (Object)null && (Object)(object)GM.CurrentPlayerBody != (Object)null && (Object)(object)GM.CurrentPlayerBody.Torso != (Object)null) { float num = Vector3.Distance(Firearm.StockPos.position, GM.CurrentPlayerBody.Torso.position); flag = num < StabilizeDistance; } if (ForegripWhenShouldered && flag && (Object)(object)((FVRInteractiveObject)Firearm).m_hand != (Object)null && (Object)(object)((FVRInteractiveObject)Firearm).m_hand.OtherHand == (Object)null) { if ((Object)(object)((FVRPhysicalObject)Firearm).AltGrip == (Object)null || (Object)(object)((FVRPhysicalObject)Firearm).AltGrip == (Object)(object)_dummyAltGrip) { if ((Object)(object)_dummyAltGrip == (Object)null) { _dummyAltGrip = ((Component)Firearm).gameObject.AddComponent<FVRAlternateGrip>(); _dummyAltGrip.PrimaryObject = (FVRPhysicalObject)(object)Firearm; ((FVRInteractiveObject)_dummyAltGrip).m_hand = ((FVRInteractiveObject)Firearm).m_hand; } ((FVRPhysicalObject)Firearm).AltGrip = _dummyAltGrip; } } else if ((Object)(object)((FVRPhysicalObject)Firearm).AltGrip == (Object)(object)_dummyAltGrip) { Object.Destroy((Object)(object)_dummyAltGrip); ((FVRPhysicalObject)Firearm).AltGrip = null; _dummyAltGrip = null; } } } public class StockExtension : MonoBehaviour { public FVRFireArm Firearm; [Tooltip("How far forward the weapon moves when shouldered")] public float PushDistance = 0.06f; public float LerpSpeed = 10f; private Vector3 _originalLocalPos; private float _lerp; private void Awake() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) _originalLocalPos = ((Component)this).transform.localPosition; } private void Update() { //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: 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_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: 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_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: 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) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)Firearm == (Object)null)) { bool flag = Firearm.IsShoulderStabilized(); _lerp = Mathf.MoveTowards(_lerp, (!flag) ? 0f : 1f, Time.deltaTime * LerpSpeed); if ((Object)(object)((Component)this).transform.parent != (Object)null) { Vector3 val = ((Component)this).