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;
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_002d: 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_006b: 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_0071: 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_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)
if (_hasBlasted)
{
return;
}
_hasBlasted = true;
if (!((Object)(object)GM.CurrentMovementManager == (Object)null))
{
Vector3 forward = Vector3.forward;
if ((Object)(object)Projectile != (Object)null && (Object)(object)((Component)Projectile).transform != (Object)null)
{
forward = ((Component)Projectile).transform.forward;
}
Vector3 val = -forward;
val.y = 0f;
((Vector3)(ref val)).Normalize();
GM.CurrentMovementManager.Blast(val, RecoilForce, false);
}
}
}
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.SR88A_Rifle;
[BepInPlugin("Volks.SR88A_Rifle", "SR88A_Rifle", "1.0.0")]
[BepInProcess("h3vr.exe")]
[Description("Built with MeatKit")]
[BepInDependency("h3vr.otherloader", "1.3.0")]
public class SR88A_RiflePlugin : 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.SR88A_Rifle");
OtherLoader.RegisterDirectLoad(BasePath, "Volks.SR88A_Rifle", "", "", "sr88a_rifle", "");
}
}
public class PhysicalSlideLock : FVRInteractiveObject
{
[Header("Target Handgun")]
public Handgun Weapon;
[Header("Visual Switch")]
public Transform LockSwitch;
public InterpStyle InterpStyle = (InterpStyle)1;
public Axis Axis = (Axis)2;
public float LockedPos = 1f;
public float UnlockedPos = 0f;
[Header("Audio")]
public bool PlaySoundOnToggle = true;
public AudioEvent AudEvent_Toggle;
public bool UseDeniedSound = true;
public AudioEvent AudEvent_Denied;
private MethodInfo miEngage;
private MethodInfo miDisengage;
public override void Awake()
{
((FVRInteractiveObject)this).Awake();
CacheReflection();
if ((Object)(object)Weapon != (Object)null)
{
UpdateVisual(Weapon.IsSLideLockMechanismEngaged);
}
}
private void CacheReflection()
{
if (!((Object)(object)Weapon == (Object)null))
{
Type typeFromHandle = typeof(Handgun);
miEngage = typeFromHandle.GetMethod("EngageSlideLockMechanism", BindingFlags.Instance | BindingFlags.NonPublic);
miDisengage = typeFromHandle.GetMethod("DisEngageSlideLockMechanism", BindingFlags.Instance | BindingFlags.NonPublic);
}
}
public override void FVRUpdate()
{
((FVRInteractiveObject)this).FVRUpdate();
if ((Object)(object)Weapon != (Object)null && (Object)(object)LockSwitch != (Object)null)
{
UpdateVisual(Weapon.IsSLideLockMechanismEngaged);
}
}
public override void SimpleInteraction(FVRViveHand hand)
{
((FVRInteractiveObject)this).SimpleInteraction(hand);
ToggleLock();
}
private void ToggleLock()
{
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)Weapon == (Object)null)
{
return;
}
if ((object)miEngage == null || (object)miDisengage == null)
{
CacheReflection();
}
if (!Weapon.IsSLideLockMechanismEngaged)
{
if ((Object)(object)Weapon.Slide == (Object)null)
{
PlayDeniedSound();
return;
}
bool flag = false;
float num = -1f;
try
{
if ((int)Weapon.Slide.CurPos == 0)
{
flag = true;
}
else
{
num = Weapon.Slide.GetSlideLerpBetweenLockAndFore();
if (num >= 0.9f)
{
flag = true;
}
else
{
try
{
float z = ((Component)Weapon.Slide).transform.localPosition.z;
float z2 = Weapon.Slide.Point_Slide_Forward.localPosition.z;
if (Mathf.Abs(z - z2) <= 0.0015f)
{
flag = true;
}
}
catch
{
}
}
}
}
catch (Exception)
{
}
if (!flag)
{
PlayDeniedSound();
return;
}
if ((object)miEngage != null)
{
try
{
miEngage.Invoke(Weapon, null);
UpdateVisual(Weapon.IsSLideLockMechanismEngaged);
PlayToggleSound();
return;
}
catch (Exception)
{
PlayDeniedSound();
return;
}
}
PlayDeniedSound();
return;
}
if ((object)miDisengage != null)
{
try
{
miDisengage.Invoke(Weapon, null);
UpdateVisual(Weapon.IsSLideLockMechanismEngaged);
PlayToggleSound();
return;
}
catch (Exception)
{
PlayDeniedSound();
return;
}
}
PlayDeniedSound();
}
private void PlayToggleSound()
{
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
if (PlaySoundOnToggle && AudEvent_Toggle != null && !((Object)(object)Weapon == (Object)null))
{
((FVRFireArm)Weapon).PlayAudioAsHandling(AudEvent_Toggle, ((Component)this).transform.position);
}
}
private void PlayDeniedSound()
{
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
if (PlaySoundOnToggle && UseDeniedSound && AudEvent_Denied != null && !((Object)(object)Weapon == (Object)null))
{
((FVRFireArm)Weapon).PlayAudioAsHandling(AudEvent_Denied, ((Component)this).transform.position);
}
}
private void UpdateVisual(bool locked)
{
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)LockSwitch == (Object)null) && !((Object)(object)Weapon == (Object)null))
{
float num = ((!locked) ? UnlockedPos : LockedPos);
((FVRPhysicalObject)Weapon).SetAnimatedComponent(LockSwitch, num, InterpStyle, Axis);
}
}
}
public class ThermalOverlayWithZoomDisplay : PIPScopeGUIDrawer
{
public PIPScopeController ScopeController;
public Canvas OverlayCanvas;
public Text ZoomText;
public Material OverlayMaterial;
public Texture2D OverlayTexture;
public Color OverlayColor = Color.white;
public float UpdateInterval = 0.1f;
private float nextUpdateTime = 0f;
private int lastThermalZoomIndex = -1;
public override void DrawGUI(PIPScope scope, Canvas canvas, Vector2 canvasSize)
{
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
if (scope.enableThermal)
{
if ((Object)(object)OverlayMaterial != (Object)null && (Object)(object)OverlayTexture != (Object)null)
{
OverlayMaterial.mainTexture = (Texture)(object)OverlayTexture;
OverlayMaterial.color = OverlayColor;
OverlayMaterial.SetPass(0);
Rect val = default(Rect);
((Rect)(ref val))..ctor(0f, 0f, canvasSize.x, canvasSize.y);
GUI.DrawTexture(val, (Texture)(object)OverlayTexture);
}
UpdateZoomLevelDisplay();
}
}
private void UpdateZoomLevelDisplay()
{
if (Time.time < nextUpdateTime)
{
return;
}
nextUpdateTime = Time.time + UpdateInterval;
if ((Object)(object)ScopeController == (Object)null || (Object)(object)ZoomText == (Object)null)
{
Debug.LogWarning((object)"ThermalOverlayWithZoomDisplay: Missing necessary references!");
return;
}
int thermalZoomIndex = ScopeController.ThermalZoomIndex;
if (lastThermalZoomIndex != thermalZoomIndex)
{
lastThermalZoomIndex = thermalZoomIndex;
if (ScopeController.ThermalDigitalZoomMagnifications != null && thermalZoomIndex >= 0 && thermalZoomIndex < ScopeController.ThermalDigitalZoomMagnifications.Count)
{
float num = ScopeController.ThermalDigitalZoomMagnifications[thermalZoomIndex];
ZoomText.text = $"Zoom Level: {num:F1}x";
}
else
{
ZoomText.text = "Zoom Level: N/A";
}
}
}
}
public class BeltPhysic : MonoBehaviour
{
public enum SwingPlane
{
AnchorForward,
AnchorUp,
AnchorRight,
Custom
}
[Header("References")]
[Tooltip("Prefab for a single link (should include round/bullet visual as a child).")]
public GameObject BeltLinkPrefab;
[Tooltip("Feed point - node 0 is pinned here")]
public Transform Anchor;
[Tooltip("Optional override for anchor")]
public Transform StartAnchorOverride;
[Header("Belt sizing")]
public int MaxLinks = 50;
public float LinkSpacing = 0.04f;
public bool AutoSyncMagazine = true;
public FVRFireArmMagazine Magazine;
public int ManualRounds = 10;
public bool ClampToMagazineCapacity = true;
[Header("Physics")]
public float Gravity = 9.8f;
[Range(0f, 1f)]
public float Damping = 0.98f;
public int Iterations = 6;
[Tooltip("Max angle (deg) between adjacent links; helps avoid sharp kinks.")]
public float MaxBendAngle = 45f;
[Header("Flap / Plane")]
[Tooltip("Which axis/plane the belt should flap on.")]
public SwingPlane PlaneChoice = SwingPlane.AnchorForward;
[Tooltip("When PlaneChoice==Custom, this world normal is used.")]
public Vector3 CustomPlaneNormal = Vector3.forward;
[Tooltip("If true the belt is constrained to the chosen plane (left/right flap).")]
public bool ConstrainToPlane = true;
[Header("Visuals")]
public Vector3 LinkRotationOffset = Vector3.zero;
private List<GameObject> _pool = new List<GameObject>();
private Vector3[] _pos;
private Vector3[] _old;
private int _activeLinks;
private bool _initialized = false;
private void Awake()
{
_pos = (Vector3[])(object)new Vector3[MaxLinks];
_old = (Vector3[])(object)new Vector3[MaxLinks];
for (int i = 0; i < MaxLinks; i++)
{
GameObject val = null;
if ((Object)(object)BeltLinkPrefab != (Object)null)
{
val = Object.Instantiate<GameObject>(BeltLinkPrefab, ((Component)this).transform);
val.SetActive(false);
}
_pool.Add(val);
}
}
private void Start()
{
int roundCount = GetRoundCount();
Rebuild(roundCount);
Paint();
_initialized = true;
}
private void FixedUpdate()
{
Transform anchor = GetAnchor();
if ((Object)(object)anchor == (Object)null)
{
return;
}
int roundCount = GetRoundCount();
if (roundCount <= 0)
{
Object.Destroy((Object)(object)((Component)this).gameObject);
return;
}
if (!_initialized)
{
Rebuild(roundCount);
_initialized = true;
}
else if (roundCount != _activeLinks)
{
Resize(roundCount);
}
Simulate(anchor, Time.fixedDeltaTime);
Paint();
}
private Transform GetAnchor()
{
return (!((Object)(object)StartAnchorOverride != (Object)null)) ? Anchor : StartAnchorOverride;
}
private int GetRoundCount()
{
if (AutoSyncMagazine && (Object)(object)Magazine != (Object)null)
{
int num = Magazine.m_numRounds;
if (ClampToMagazineCapacity)
{
num = Mathf.Min(num, Magazine.m_capacity);
}
return Mathf.Clamp(num, 0, MaxLinks);
}
return Mathf.Clamp(ManualRounds, 0, MaxLinks);
}
private void Rebuild(int count)
{
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
Transform anchor = GetAnchor();
if ((Object)(object)anchor == (Object)null)
{
return;
}
for (int i = count; i < _pool.Count; i++)
{
if ((Object)(object)_pool[i] != (Object)null)
{
_pool[i].SetActive(false);
}
}
_activeLinks = Mathf.Clamp(count, 0, MaxLinks);
Vector3 right = anchor.right;
if (((Vector3)(ref right)).sqrMagnitude < 1E-06f)
{
right = Vector3.right;
}
for (int j = 0; j < _activeLinks; j++)
{
Vector3 val = anchor.position + right * ((float)j * LinkSpacing) + Vector3.down * ((float)j * LinkSpacing * 0.05f);
_pos[j] = val;
_old[j] = val;
}
}
private void Resize(int targetLinks)
{
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
//IL_0116: Unknown result type (might be due to invalid IL or missing references)
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
targetLinks = Mathf.Clamp(targetLinks, 0, MaxLinks);
if (targetLinks == _activeLinks)
{
return;
}
if (targetLinks > _activeLinks)
{
if (_activeLinks == 0)
{
Rebuild(targetLinks);
return;
}
for (int i = _activeLinks; i < targetLinks; i++)
{
Vector3 val = _pos[i - 1] - _pos[i - 2];
Vector3 val2 = ((Vector3)(ref val)).normalized;
if (i == 1)
{
Vector3 val3 = _pos[0] - GetAnchor().position;
val2 = ((Vector3)(ref val3)).normalized;
}
if (((Vector3)(ref val2)).sqrMagnitude < 1E-06f)
{
val2 = Vector3.down;
}
Vector3 val4 = _pos[i - 1] + val2 * LinkSpacing;
_pos[i] = val4;
_old[i] = val4;
}
}
else
{
for (int j = targetLinks; j < _activeLinks; j++)
{
if ((Object)(object)_pool[j] != (Object)null)
{
_pool[j].SetActive(false);
}
}
}
_activeLinks = targetLinks;
}
private void Simulate(Transform a, float dt)
{
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_014f: Unknown result type (might be due to invalid IL or missing references)
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
//IL_0124: Unknown result type (might be due to invalid IL or missing references)
//IL_016b: Unknown result type (might be due to invalid IL or missing references)
//IL_017f: Unknown result type (might be due to invalid IL or missing references)
//IL_0184: Unknown result type (might be due to invalid IL or missing references)
//IL_0189: Unknown result type (might be due to invalid IL or missing references)
//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
//IL_0208: Unknown result type (might be due to invalid IL or missing references)
//IL_020d: Unknown result type (might be due to invalid IL or missing references)
//IL_020f: Unknown result type (might be due to invalid IL or missing references)
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
//IL_0227: Unknown result type (might be due to invalid IL or missing references)
//IL_022c: Unknown result type (might be due to invalid IL or missing references)
//IL_022e: Unknown result type (might be due to invalid IL or missing references)
//IL_0233: Unknown result type (might be due to invalid IL or missing references)
//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
//IL_044c: Unknown result type (might be due to invalid IL or missing references)
//IL_044d: Unknown result type (might be due to invalid IL or missing references)
//IL_0276: Unknown result type (might be due to invalid IL or missing references)
//IL_028a: Unknown result type (might be due to invalid IL or missing references)
//IL_028f: Unknown result type (might be due to invalid IL or missing references)
//IL_0294: Unknown result type (might be due to invalid IL or missing references)
//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
//IL_02b7: Unknown result type (might be due to invalid IL or missing references)
//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
//IL_03ed: Unknown result type (might be due to invalid IL or missing references)
//IL_03f2: Unknown result type (might be due to invalid IL or missing references)
//IL_03f3: Unknown result type (might be due to invalid IL or missing references)
//IL_03f8: Unknown result type (might be due to invalid IL or missing references)
//IL_03fa: Unknown result type (might be due to invalid IL or missing references)
//IL_03fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0413: Unknown result type (might be due to invalid IL or missing references)
//IL_0418: Unknown result type (might be due to invalid IL or missing references)
//IL_041c: Unknown result type (might be due to invalid IL or missing references)
//IL_0421: Unknown result type (might be due to invalid IL or missing references)
//IL_0426: Unknown result type (might be due to invalid IL or missing references)
//IL_02f2: Unknown result type (might be due to invalid IL or missing references)
//IL_02f6: Unknown result type (might be due to invalid IL or missing references)
//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
//IL_02fd: Unknown result type (might be due to invalid IL or missing references)
//IL_0301: Unknown result type (might be due to invalid IL or missing references)
//IL_0306: Unknown result type (might be due to invalid IL or missing references)
//IL_0308: Unknown result type (might be due to invalid IL or missing references)
//IL_030a: Unknown result type (might be due to invalid IL or missing references)
//IL_0343: Unknown result type (might be due to invalid IL or missing references)
//IL_0345: Unknown result type (might be due to invalid IL or missing references)
//IL_0347: Unknown result type (might be due to invalid IL or missing references)
//IL_034c: Unknown result type (might be due to invalid IL or missing references)
//IL_036f: Unknown result type (might be due to invalid IL or missing references)
//IL_0374: Unknown result type (might be due to invalid IL or missing references)
//IL_0379: Unknown result type (might be due to invalid IL or missing references)
//IL_0397: Unknown result type (might be due to invalid IL or missing references)
//IL_039c: Unknown result type (might be due to invalid IL or missing references)
//IL_039e: Unknown result type (might be due to invalid IL or missing references)
//IL_03a0: Unknown result type (might be due to invalid IL or missing references)
//IL_03a7: Unknown result type (might be due to invalid IL or missing references)
//IL_03ac: Unknown result type (might be due to invalid IL or missing references)
//IL_03b1: Unknown result type (might be due to invalid IL or missing references)
if (_activeLinks <= 0)
{
return;
}
Vector3 position = a.position;
Vector3 val = Vector3.down * (Gravity * dt * dt);
for (int i = 1; i < _activeLinks; i++)
{
Vector3 val2 = _pos[i];
Vector3 val3 = (val2 - _old[i]) * Damping;
_old[i] = val2;
ref Vector3 reference = ref _pos[i];
reference = val2 + val3 + val;
}
Vector3 val4;
if (ConstrainToPlane)
{
switch (PlaneChoice)
{
case SwingPlane.AnchorForward:
val4 = a.forward;
break;
case SwingPlane.AnchorUp:
val4 = a.up;
break;
case SwingPlane.AnchorRight:
val4 = a.right;
break;
default:
val4 = ((Vector3)(ref CustomPlaneNormal)).normalized;
if (((Vector3)(ref val4)).sqrMagnitude < 1E-06f)
{
val4 = Vector3.forward;
}
break;
}
}
else
{
val4 = Vector3.zero;
}
for (int j = 0; j < Iterations; j++)
{
_pos[0] = position;
for (int k = 1; k < _activeLinks; k++)
{
Vector3 val5 = _pos[k] - _pos[k - 1];
float magnitude = ((Vector3)(ref val5)).magnitude;
if (!(magnitude < 1E-06f))
{
float num = (magnitude - LinkSpacing) / magnitude;
if (k == 1)
{
ref Vector3 reference2 = ref _pos[k];
reference2 -= val5 * num;
continue;
}
Vector3 val6 = val5 * (num * 0.5f);
ref Vector3 reference3 = ref _pos[k - 1];
reference3 += val6;
ref Vector3 reference4 = ref _pos[k];
reference4 -= val6;
}
}
if (MaxBendAngle < 179f)
{
for (int l = 2; l < _activeLinks; l++)
{
Vector3 val7 = _pos[l - 1] - _pos[l - 2];
Vector3 val8 = _pos[l] - _pos[l - 1];
float magnitude2 = ((Vector3)(ref val7)).magnitude;
float magnitude3 = ((Vector3)(ref val8)).magnitude;
if (magnitude2 < 1E-06f || magnitude3 < 1E-06f)
{
continue;
}
Vector3 val9 = val7 / magnitude2;
Vector3 val10 = val8 / magnitude3;
float num2 = Mathf.Clamp(Vector3.Dot(val9, val10), -1f, 1f);
float num3 = Mathf.Acos(num2) * 57.29578f;
if (!(num3 <= MaxBendAngle))
{
Vector3 val11 = Vector3.Cross(val9, val10);
if (!(((Vector3)(ref val11)).sqrMagnitude < 1E-08f))
{
Quaternion val12 = Quaternion.AngleAxis(num3 - MaxBendAngle, ((Vector3)(ref val11)).normalized);
ref Vector3 reference5 = ref _pos[l];
reference5 = _pos[l - 1] + val12 * val10 * magnitude3;
}
}
}
}
if (ConstrainToPlane)
{
for (int m = 1; m < _activeLinks; m++)
{
Vector3 val13 = _pos[m] - position;
float num4 = Vector3.Dot(val13, val4);
ref Vector3 reference6 = ref _pos[m];
reference6 -= val4 * num4;
}
}
_pos[0] = position;
}
}
private void Paint()
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
//IL_0128: Unknown result type (might be due to invalid IL or missing references)
//IL_012d: Unknown result type (might be due to invalid IL or missing references)
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
//IL_0136: Unknown result type (might be due to invalid IL or missing references)
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
//IL_0174: Unknown result type (might be due to invalid IL or missing references)
//IL_0176: Unknown result type (might be due to invalid IL or missing references)
//IL_017c: Unknown result type (might be due to invalid IL or missing references)
//IL_0181: Unknown result type (might be due to invalid IL or missing references)
//IL_0186: Unknown result type (might be due to invalid IL or missing references)
//IL_0149: Unknown result type (might be due to invalid IL or missing references)
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
//IL_0243: Unknown result type (might be due to invalid IL or missing references)
//IL_024f: Unknown result type (might be due to invalid IL or missing references)
Transform anchor = GetAnchor();
if ((Object)(object)anchor == (Object)null)
{
return;
}
Vector3 up = anchor.up;
for (int i = 0; i < _pool.Count; i++)
{
if (i >= _activeLinks)
{
if ((Object)(object)_pool[i] != (Object)null)
{
_pool[i].SetActive(false);
}
continue;
}
GameObject val = _pool[i];
if ((Object)(object)val == (Object)null)
{
continue;
}
val.SetActive(true);
Vector3 val2 = ((i < _activeLinks - 1) ? (_pos[i + 1] - _pos[i]) : ((i <= 0) ? anchor.forward : (_pos[i] - _pos[i - 1])));
if (((Vector3)(ref val2)).sqrMagnitude < 1E-06f)
{
val2 = anchor.forward;
}
((Vector3)(ref val2)).Normalize();
Vector3 val3 = Vector3.ProjectOnPlane(up, val2);
Vector3 val4 = ((Vector3)(ref val3)).normalized;
if (((Vector3)(ref val4)).sqrMagnitude < 1E-06f)
{
val4 = Vector3.up;
}
val.transform.position = _pos[i];
val.transform.rotation = Quaternion.LookRotation(val2, val4) * Quaternion.Euler(LinkRotationOffset);
Transform val5 = val.transform.Find("Round");
if ((Object)(object)val5 == (Object)null)
{
val5 = val.transform.Find("Bullet");
}
if ((Object)(object)val5 == (Object)null)
{
MeshRenderer[] componentsInChildren = val.GetComponentsInChildren<MeshRenderer>(true);
MeshRenderer[] array = componentsInChildren;
foreach (MeshRenderer val6 in array)
{
if ((Object)(object)val6 != (Object)null && (Object)(object)((Component)val6).transform != (Object)(object)val.transform)
{
val5 = ((Component)val6).transform;
break;
}
}
}
if ((Object)(object)val5 != (Object)null)
{
val5.localPosition = Vector3.zero;
val5.localRotation = Quaternion.identity;
}
}
}
}
public class ManualEjectorRod : FVRInteractiveObject
{
[Header("Ejector Rod Points")]
public Transform Point_Rod_Rest;
public Transform Point_Rod_FullyOut;
public Transform Point_Rod_Eject;
public Transform Point_Rod_Closed;
[Header("Spring Visual")]
public Transform SpringObject;
public Vector3 SpringScale_Rest = Vector3.one;
public Vector3 SpringScale_FullyOut = new Vector3(1f, 1f, 0.5f);
[Header("Revolver Reference")]
public SingleActionRevolver Revolver;
private float m_rodZ_rest;
private float m_rodZ_out;
private float m_rodZ_eject;
private float m_rodZ_closed;
private float m_rodZ_current;
private float m_rodZ_heldTarget;
public override void Awake()
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).Awake();
m_rodZ_rest = Point_Rod_Rest.localPosition.z;
m_rodZ_out = Point_Rod_FullyOut.localPosition.z;
m_rodZ_current = m_rodZ_rest;
m_rodZ_eject = Point_Rod_Eject.localPosition.z;
m_rodZ_closed = Point_Rod_Closed.localPosition.z;
}
public override void BeginInteraction(FVRViveHand hand)
{
((FVRInteractiveObject)this).BeginInteraction(hand);
}
public override void UpdateInteraction(FVRViveHand hand)
{
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
//IL_013f: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).UpdateInteraction(hand);
Vector3 closestValidPoint = GetClosestValidPoint(Point_Rod_Rest.position, Point_Rod_FullyOut.position, ((HandInput)(ref hand.Input)).Pos);
m_rodZ_heldTarget = ((Component)this).transform.parent.InverseTransformPoint(closestValidPoint).z;
float num = Mathf.Min(m_rodZ_rest, m_rodZ_out);
float num2 = Mathf.Max(m_rodZ_rest, m_rodZ_out);
if ((Object)(object)Revolver != (Object)null && !Revolver.m_isStateToggled)
{
if (m_rodZ_rest < m_rodZ_out)
{
num2 = Mathf.Min(num2, m_rodZ_closed);
}
else
{
num = Mathf.Max(num, m_rodZ_closed);
}
}
m_rodZ_current = Mathf.Clamp(m_rodZ_heldTarget, num, num2);
Vector3 localPosition = ((Component)this).transform.localPosition;
localPosition.z = m_rodZ_current;
((Component)this).transform.localPosition = localPosition;
if ((Object)(object)SpringObject != (Object)null)
{
float num3 = Mathf.InverseLerp(m_rodZ_rest, m_rodZ_out, m_rodZ_current);
SpringObject.localScale = Vector3.Lerp(SpringScale_Rest, SpringScale_FullyOut, num3);
}
if ((Object)(object)Revolver != (Object)null && Revolver.m_isStateToggled && ((!(m_rodZ_rest < m_rodZ_out)) ? (m_rodZ_current <= m_rodZ_eject) : (m_rodZ_current >= m_rodZ_eject)))
{
Revolver.EjectPrevCylinder();
}
}
public override void EndInteraction(FVRViveHand hand)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).EndInteraction(hand);
Vector3 localPosition = ((Component)this).transform.localPosition;
localPosition.z = m_rodZ_rest;
((Component)this).transform.localPosition = localPosition;
}
private Vector3 GetClosestValidPoint(Vector3 a, Vector3 b, Vector3 point)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = b - a;
float num = Vector3.Dot(point - a, ((Vector3)(ref val)).normalized) / ((Vector3)(ref val)).magnitude;
num = Mathf.Clamp01(num);
return a + val * num;
}
public void AnimateEject()
{
((MonoBehaviour)this).StartCoroutine(AnimateEjectRoutine());
}
private IEnumerator AnimateEjectRoutine()
{
float duration = 0.15f;
float t2 = 0f;
Vector3 localPos = ((Component)this).transform.localPosition;
float startZ = m_rodZ_rest;
float endZ = m_rodZ_eject;
while (t2 < duration)
{
t2 += Time.deltaTime;
float lerp = Mathf.Clamp01(t2 / duration);
localPos.z = Mathf.Lerp(startZ, endZ, lerp);
((Component)this).transform.localPosition = localPos;
yield return null;
}
localPos.z = endZ;
((Component)this).transform.localPosition = localPos;
if ((Object)(object)Revolver != (Object)null && Revolver.m_isStateToggled)
{
Revolver.EjectPrevCylinder();
}
t2 = 0f;
while (t2 < duration)
{
t2 += Time.deltaTime;
float lerp2 = Mathf.Clamp01(t2 / duration);
localPos.z = Mathf.Lerp(endZ, startZ, lerp2);
((Component)this).transform.localPosition = localPos;
yield return null;
}
localPos.z = startZ;
((Component)this).transform.localPosition = localPos;
}
}
public class SARotatingCylinder : FVRInteractiveObject
{
[Header("References")]
public SingleActionRevolver Revolver;
public ManualEjectorRod EjectorRod;
[Header("Rotation Settings")]
public float SnapSpeed = 12f;
public float RotationThreshold = 15f;
[Header("Cylinder Direction")]
public bool RotateClockwise = true;
private int m_lastChamber = -1;
private float m_lastAngle = 0f;
private bool m_isProxyHoldingRevolver = false;
private SingleActionRevolverCylinder Cylinder => (!((Object)(object)Revolver != (Object)null)) ? null : Revolver.Cylinder;
private int GetAccessibleChamber()
{
return (!Revolver.IsAccessTwoChambersBack) ? Revolver.PrevChamber : Revolver.PrevChamber2;
}
public override void BeginInteraction(FVRViveHand hand)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).BeginInteraction(hand);
if (!((Object)(object)Cylinder == (Object)null))
{
Vector3 val = ((HandInput)(ref hand.Input)).Pos - ((Component)this).transform.position;
m_lastAngle = Mathf.Atan2(val.y, val.x) * 57.29578f;
if ((Object)(object)Revolver != (Object)null && !((FVRInteractiveObject)Revolver).IsHeld)
{
((FVRInteractiveObject)Revolver).BeginInteraction(hand);
m_isProxyHoldingRevolver = true;
}
}
}
public override void UpdateInteraction(FVRViveHand hand)
{
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0187: Unknown result type (might be due to invalid IL or missing references)
//IL_018c: Unknown result type (might be due to invalid IL or missing references)
//IL_019a: Unknown result type (might be due to invalid IL or missing references)
//IL_019f: Unknown result type (might be due to invalid IL or missing references)
//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
//IL_0119: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).UpdateInteraction(hand);
if ((Object)(object)Cylinder == (Object)null || (Object)(object)Revolver == (Object)null || !Revolver.m_isStateToggled)
{
return;
}
Vector3 val = ((HandInput)(ref hand.Input)).Pos - ((Component)this).transform.position;
float num = Mathf.Atan2(val.y, val.x) * 57.29578f;
float num2 = Mathf.DeltaAngle(m_lastAngle, num);
if (base.m_isHeld && Mathf.Abs(num2) > RotationThreshold)
{
int num3 = (RotateClockwise ? 1 : (-1));
int accessibleChamber = GetAccessibleChamber();
int curChamber = (accessibleChamber + num3 + Cylinder.NumChambers) % Cylinder.NumChambers;
Revolver.CurChamber = curChamber;
m_lastChamber = Revolver.CurChamber;
m_lastAngle = num;
((Component)this).transform.localRotation = Cylinder.GetLocalRotationFromCylinder(Revolver.CurChamber);
((FVRFireArm)Revolver).PlayAudioEvent((FirearmAudioEventType)15, 1f);
if (hand.Input.TriggerDown && (Object)(object)EjectorRod != (Object)null)
{
EjectorRod.AnimateEject();
}
}
else
{
int accessibleChamber2 = GetAccessibleChamber();
Revolver.CurChamber = accessibleChamber2;
Quaternion localRotationFromCylinder = Cylinder.GetLocalRotationFromCylinder(accessibleChamber2);
((Component)this).transform.localRotation = Quaternion.Slerp(((Component)this).transform.localRotation, localRotationFromCylinder, Time.deltaTime * SnapSpeed);
if (accessibleChamber2 != m_lastChamber)
{
m_lastChamber = accessibleChamber2;
}
}
}
public override void EndInteraction(FVRViveHand hand)
{
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).EndInteraction(hand);
if ((Object)(object)Cylinder != (Object)null && (Object)(object)Revolver != (Object)null)
{
int accessibleChamber = GetAccessibleChamber();
Revolver.CurChamber = accessibleChamber;
((Component)this).transform.localRotation = Cylinder.GetLocalRotationFromCylinder(accessibleChamber);
}
if (m_isProxyHoldingRevolver && (Object)(object)Revolver != (Object)null && ((FVRInteractiveObject)Revolver).IsHeld)
{
((FVRInteractiveObject)Revolver).EndInteraction(hand);
m_isProxyHoldingRevolver = false;
}
}
}
public class EjectionFollow : MonoBehaviour
{
[Header("Open Bolt Weapon Config")]
public OpenBoltReceiver FireArm;
public Transform EjectionPortTransform;
public Vector3 LocalEjectionSpeed = new Vector3(1f, 0f, 0f);
public Vector3 LocalEjectionSpin = Vector3.zero;
private void LateUpdate()
{
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)FireArm == (Object)null) && !((Object)(object)EjectionPortTransform == (Object)null))
{
FireArm.EjectionSpeed = EjectionPortTransform.right * LocalEjectionSpeed.x + EjectionPortTransform.up * LocalEjectionSpeed.y + EjectionPortTransform.forward * LocalEjectionSpeed.z;
FireArm.EjectionSpin = EjectionPortTransform.right * LocalEjectionSpin.x + EjectionPortTransform.up * LocalEjectionSpin.y + EjectionPortTransform.forward * LocalEjectionSpin.z;
}
}
}
public class OneHandedFiring : MonoBehaviour
{
public FVRFireArm Firearm;
public bool ForegripWhenShouldered = true;
public float StabilizeDistance = 0.22f;
private FVRAlternateGrip _dummyAltGrip;
private void Update()
{
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)Firearm == (Object)null)
{
return;
}
bool flag = false;
if ((Object)(object)Firearm.StockPos != (Object)null && (Object)(object)GM.CurrentPlayerBody != (Object)null && (Object)(object)GM.CurrentPlayerBody.Torso != (Object)null)
{
float num = Vector3.Distance(Firearm.StockPos.position, GM.CurrentPlayerBody.Torso.position);
flag = num < StabilizeDistance;
}
if (ForegripWhenShouldered && flag && (Object)(object)((FVRInteractiveObject)Firearm).m_hand != (Object)null && (Object)(object)((FVRInteractiveObject)Firearm).m_hand.OtherHand == (Object)null)
{
if ((Object)(object)((FVRPhysicalObject)Firearm).AltGrip == (Object)null || (Object)(object)((FVRPhysicalObject)Firearm).AltGrip == (Object)(object)_dummyAltGrip)
{
if ((Object)(object)_dummyAltGrip == (Object)null)
{
_dummyAltGrip = ((Component)Firearm).gameObject.AddComponent<FVRAlternateGrip>();
_dummyAltGrip.PrimaryObject = (FVRPhysicalObject)(object)Firearm;
((FVRInteractiveObject)_dummyAltGrip).m_hand = ((FVRInteractiveObject)Firearm).m_hand;
}
((FVRPhysicalObject)Firearm).AltGrip = _dummyAltGrip;
}
}
else if ((Object)(object)((FVRPhysicalObject)Firearm).AltGrip == (Object)(object)_dummyAltGrip)
{
Object.Destroy((Object)(object)_dummyAltGrip);
((FVRPhysicalObject)Firearm).AltGrip = null;
_dummyAltGrip = null;
}
}
}
public class StockExtension : MonoBehaviour
{
public FVRFireArm Firearm;
[Tooltip("How far forward the weapon moves when shouldered")]
public float PushDistance = 0.06f;
public float LerpSpeed = 10f;
private Vector3 _originalLocalPos;
private float _lerp;
private void Awake()
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
_originalLocalPos = ((Component)this).transform.localPosition;
}
private void Update()
{
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)Firearm == (Object)null))
{
bool flag = Firearm.IsShoulderStabilized();
_lerp = Mathf.MoveTowards(_lerp, (!flag) ? 0f : 1f, Time.deltaTime * LerpSpeed);
if ((Object)(object)((Component)this).transform.parent != (Object)null)
{
Vector3 val = ((Component)this).transform.parent.InverseTransformDirection(((Component)Firearm).transform.forward);
Vector3 val2 = _originalLocalPos + val * PushDistance;
((Component)this).transform.localPosition = Vector3.Lerp(_originalLo