Decompiled source of WaltherPPKS 22LR v1.0.0
WaltherPPKS_22LR.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")] public float RecoilForce = 3.5f; public bool UseHeadDirection = true; 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; } ApplyRecoil(); } private void ApplyRecoil() { //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_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_005e: 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_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: 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) //IL_00ab: 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_00b4: Unknown result type (might be due to invalid IL or missing references) if (_hasBlasted) { return; } _hasBlasted = true; if (!((Object)(object)GM.CurrentMovementManager == (Object)null) && !((Object)(object)GM.CurrentPlayerBody == (Object)null)) { Vector3 forward = ((Component)GM.CurrentMovementManager).transform.forward; Vector3 up = ((Component)GM.CurrentMovementManager).transform.up; Vector3 val = Vector3.ProjectOnPlane(forward, up); Vector3 normalized = ((Vector3)(ref val)).normalized; if ((Object)(object)Projectile != (Object)null && (Object)(object)((Component)Projectile).transform != (Object)null) { Vector3 val2 = Vector3.ProjectOnPlane(((Component)Projectile).transform.forward, up); normalized = ((Vector3)(ref val2)).normalized; } ((MonoBehaviour)this).StartCoroutine(ApplyRecoilSmoothly(-normalized, RecoilForce, 0.2f)); } } private IEnumerator ApplyRecoilSmoothly(Vector3 direction, float force, float duration) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) float elapsed = 0f; while (elapsed < duration) { float stepForce = force * Time.deltaTime / duration; GM.CurrentMovementManager.Blast(direction, stepForce, true); elapsed += Time.deltaTime; 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.WaltherPPKS_22LR; [BepInPlugin("Volks.WaltherPPKS_22LR", "WaltherPPKS_22LR", "1.0.0")] [BepInProcess("h3vr.exe")] [Description("Built with MeatKit")] [BepInDependency("h3vr.otherloader", "1.3.0")] public class WaltherPPKS_22LRPlugin : 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.WaltherPPKS_22LR"); OtherLoader.RegisterDirectLoad(BasePath, "Volks.WaltherPPKS_22LR", "", "", "waltherppks22lr_pistol", ""); } } 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 { [Header("Belt Settings")] public GameObject BeltLinkPrefab; public int MaxLinks = 50; public float LinkSpacing = 0.04f; public Transform BeltStart; [Header("Physics")] [Tooltip("Gravity acceleration applied to each free link.")] public float Gravity = 9.8f; [Tooltip("Velocity retention per step (0 = no inertia, 1 = no damping). 0.98 is a good starting point.")] [Range(0f, 1f)] public float Damping = 0.98f; [Tooltip("Number of constraint passes per physics step. More = stiffer belt.")] public int Iterations = 8; [Header("Bend Limit")] [Tooltip("Maximum angle in degrees between two consecutive links.")] public float MaxBendAngle = 45f; [Header("Link Visual Offsets")] [Tooltip("Rotational offset applied on top of the chain direction. Use to fix model alignment.")] public Vector3 LinkRotationOffset = Vector3.zero; [Header("Magazine Reference")] public FVRFireArmMagazine Magazine; public bool AutoSyncMagazine = true; public bool ClampToMagazineCapacity = true; public int ManualRounds = 0; [Header("Anchoring")] [Tooltip("If set, the first link is pinned here instead of BeltStart.")] public Transform StartAnchorOverride; private readonly List<GameObject> _linkPool = new List<GameObject>(); private Vector3[] _pos; private Vector3[] _oldPos; private int _activeLinks; private int _nodeCount; private void Awake() { _pos = (Vector3[])(object)new Vector3[MaxLinks + 1]; _oldPos = (Vector3[])(object)new Vector3[MaxLinks + 1]; for (int i = 0; i < MaxLinks; i++) { GameObject val = Object.Instantiate<GameObject>(BeltLinkPrefab, ((Component)this).transform); val.SetActive(false); _linkPool.Add(val); } } private void Start() { InitChain(GetRoundCount()); UpdateVisuals(); } private void FixedUpdate() { //IL_004d: Unknown result type (might be due to invalid IL or missing references) 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 (roundCount != _activeLinks) { Resize(roundCount); } Simulate(anchor.position, Time.fixedDeltaTime); UpdateVisuals(); } private Transform GetAnchor() { return (!((Object)(object)StartAnchorOverride != (Object)null)) ? BeltStart : 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 InitChain(int linkCount) { //IL_003b: 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_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_0050: 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_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_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0075: 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_0088: Unknown result type (might be due to invalid IL or missing references) Transform anchor = GetAnchor(); if (!((Object)(object)anchor == (Object)null)) { _activeLinks = Mathf.Clamp(linkCount, 0, MaxLinks); _nodeCount = _activeLinks + 1; Vector3 position = anchor.position; Vector3 forward = anchor.forward; for (int i = 0; i < _nodeCount; i++) { Vector3 val = position + forward * ((float)i * LinkSpacing); _pos[i] = val; _oldPos[i] = val; } for (int j = _activeLinks; j < MaxLinks; j++) { _linkPool[j].SetActive(false); } } } private void Resize(int targetLinks) { //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_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: 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_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: 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) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: 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_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_007c: 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) targetLinks = Mathf.Clamp(targetLinks, 0, MaxLinks); if (targetLinks > _activeLinks) { for (int i = _nodeCount; i <= targetLinks; i++) { Vector3 val = Vector3.down; if (i >= 2) { Vector3 val2 = _pos[i - 1] - _pos[i - 2]; val = ((Vector3)(ref val2)).normalized; } if (((Vector3)(ref val)).sqrMagnitude < 0.001f) { val = Vector3.down; } Vector3 val3 = _pos[i - 1] + val * LinkSpacing; _pos[i] = val3; _oldPos[i] = val3; } } else { for (int j = targetLinks; j < _activeLinks; j++) { _linkPool[j].SetActive(false); } } _activeLinks = targetLinks; _nodeCount = _activeLinks + 1; } private void Simulate(Vector3 anchorPos, float dt) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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) //IL_0040: 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_004e: 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_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0082: 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) //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_008a: 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_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_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) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0344: 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_0154: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0163: 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_017a: 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_0194: 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_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_0229: 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_025f: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) //IL_026a: Unknown result type (might be due to invalid IL or missing references) //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_02b0: Unknown result type (might be due to invalid IL or missing references) //IL_02b2: Unknown result type (might be due to invalid IL or missing references) //IL_02b4: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Unknown result type (might be due to invalid IL or missing references) //IL_02dc: Unknown result type (might be due to invalid IL or missing references) //IL_02e1: Unknown result type (might be due to invalid IL or missing references) //IL_02e6: Unknown result type (might be due to invalid IL or missing references) //IL_0304: Unknown result type (might be due to invalid IL or missing references) //IL_0309: Unknown result type (might be due to invalid IL or missing references) //IL_030b: Unknown result type (might be due to invalid IL or missing references) //IL_030d: Unknown result type (might be due to invalid IL or missing references) //IL_0314: Unknown result type (might be due to invalid IL or missing references) //IL_0319: Unknown result type (might be due to invalid IL or missing references) //IL_031e: Unknown result type (might be due to invalid IL or missing references) if (_nodeCount <= 1) { return; } Vector3 val = Vector3.down * (Gravity * dt * dt); for (int i = 1; i < _nodeCount; i++) { Vector3 val2 = _pos[i]; Vector3 val3 = (val2 - _oldPos[i]) * Damping; _oldPos[i] = val2; ref Vector3 reference = ref _pos[i]; reference = val2 + val3 + val; } for (int j = 0; j < Iterations; j++) { _pos[0] = anchorPos; for (int k = 1; k < _nodeCount; k++) { Vector3 val4 = _pos[k] - _pos[k - 1]; float magnitude = ((Vector3)(ref val4)).magnitude; if (!(magnitude < 1E-06f)) { float num = (magnitude - LinkSpacing) / magnitude; if (k == 1) { ref Vector3 reference2 = ref _pos[k]; reference2 -= val4 * num; continue; } Vector3 val5 = val4 * (num * 0.5f); ref Vector3 reference3 = ref _pos[k - 1]; reference3 += val5; ref Vector3 reference4 = ref _pos[k]; reference4 -= val5; } } if (MaxBendAngle < 179f) { for (int l = 2; l < _nodeCount; l++) { Vector3 val6 = _pos[l - 1] - _pos[l - 2]; Vector3 val7 = _pos[l] - _pos[l - 1]; float magnitude2 = ((Vector3)(ref val6)).magnitude; float magnitude3 = ((Vector3)(ref val7)).magnitude; if (magnitude2 < 1E-06f || magnitude3 < 1E-06f) { continue; } Vector3 val8 = val6 / magnitude2; Vector3 val9 = val7 / magnitude3; float num2 = Mathf.Clamp(Vector3.Dot(val8, val9), -1f, 1f); float num3 = Mathf.Acos(num2) * 57.29578f; if (!(num3 <= MaxBendAngle)) { Vector3 val10 = Vector3.Cross(val8, val9); if (!(((Vector3)(ref val10)).sqrMagnitude < 1E-08f)) { Quaternion val11 = Quaternion.AngleAxis(num3 - MaxBendAngle, ((Vector3)(ref val10)).normalized); ref Vector3 reference5 = ref _pos[l]; reference5 = _pos[l - 1] + val11 * val9 * magnitude3; } } } } _pos[0] = anchorPos; } } private void UpdateVisuals() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0015: 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_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_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_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: 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_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: 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_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: 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_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) Transform anchor = GetAnchor(); Vector3 val = ((!((Object)(object)anchor != (Object)null)) ? ((Component)this).transform.forward : anchor.forward); Vector3 val2 = ((!((Object)(object)anchor != (Object)null)) ? Vector3.up : anchor.up); for (int i = 0; i < _linkPool.Count; i++) { if (i >= _activeLinks) { _linkPool[i].SetActive(false); continue; } _linkPool[i].SetActive(true); Vector3 val3 = _pos[i + 1] - _pos[i]; if (((Vector3)(ref val3)).sqrMagnitude < 1E-06f) { val3 = val; } ((Vector3)(ref val3)).Normalize(); Vector3 val4 = Vector3.ProjectOnPlane(val2, val3); Vector3 val5 = ((Vector3)(ref val4)).normalized; if (((Vector3)(ref val5)).sqrMagnitude < 1E-06f) { Vector3 val6 = Vector3.ProjectOnPlane(Vector3.up, val3); val5 = ((Vector3)(ref val6)).normalized; } if (((Vector3)(ref val5)).sqrMagnitude < 1E-06f) { val5 = Vector3.right; } Vector3 position = (_pos[i] + _pos[i + 1]) * 0.5f; Quaternion rotation = Quaternion.LookRotation(val3, val5) * Quaternion.Euler(LinkRotationOffset); _linkPool[i].transform.position = position; _linkPool[i].transform.rotation = rotation; } } } 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; private bool m_isHeld; 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); m_isHeld = true; } 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_0015: 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_002e: Unknown result type (might be due to invalid IL or missing references) ((FVRInteractiveObject)this).EndInteraction(hand); m_isHeld = false; 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).transform.parent.InverseTransformDirection(((Component)Firearm).transform.forward); Vector3 val2 = _originalLocalPos + val * PushDistance; ((Component)this).transform.localPosition = Vector3.Lerp(_originalLocalPos, val2, _lerp); } else { Vector3 val3 = _originalLocalPos + Vector3.forward * PushDistance; ((Component)this).transform.localPosition = Vector3.Lerp(_originalLocalPos, val3, _lerp); } } } } public class ChangeQBSizeWhenFolded : MonoBehaviour { public enum Axis { X, Y, Z } public FVRPhysicalObject TargetObject; [Tooltip("The transform whose local rotation/position will be observed (eg. the folding part's ObjectToMove).")] public Transform ObservedTransform; [Header("Detection")] [Tooltip("If true, read ObservedTransform.localEulerAngles on the chosen axis. If false, read localPosition.")] public bool UseRotationCheck = true; [Tooltip("Which local axis (of ObservedTransform) to read for the threshold check.")] public Axis CheckAxis = Axis.X; [Tooltip("Angle (degrees) when using rotation check, or value when using translation check.")] public float Threshold = 179f; [Tooltip("How close to threshold is considered 'reached'. For angles this uses Mathf.DeltaAngle.")] public float Tolerance = 2f; [Header("Behavior")] [Tooltip("If true, restore original size when the observed part moves away from the threshold.")] public bool RevertOnOpen = true; [Tooltip("If true, apply the size change only the first time threshold is reached and never revert.")] public bool OnlyApplyOnce = false; private FVRPhysicalObjectSize _originalSize; private bool _originalCaptured = false; private bool _applied = false; private void Start() { //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) if ((Object)(object)TargetObject == (Object)null) { Debug.LogWarning((object)(((Object)this).name + ": TargetObject not assigned.")); } if ((Object)(object)ObservedTransform == (Object)null) { Debug.LogWarning((object)(((Object)this).name + ": ObservedTransform not assigned.")); } if ((Object)(object)TargetObject != (Object)null) { _origin