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 H3VRUtils;
using HarmonyLib;
using ModularWorkshop;
using OpenScripts2;
using OtherLoader;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.Rendering;
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]
namespace ShermanJumbo
{
public class AnimationPlayOnFire : MonoBehaviour
{
public FVRFireArm FireArm;
public Animator Animator;
public string FiringAnimationNode = "GunFire";
public void Awake()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Expected O, but got Unknown
GM.CurrentSceneSettings.ShotFiredEvent += new ShotFired(ShotFired);
}
public void OnDestroy()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Expected O, but got Unknown
GM.CurrentSceneSettings.ShotFiredEvent -= new ShotFired(ShotFired);
}
private void ShotFired(FVRFireArm firearm)
{
if ((Object)(object)firearm == (Object)(object)FireArm)
{
Animator.Play(FiringAnimationNode);
}
}
}
public class BallisticProjLightningBolt : MonoBehaviour
{
public GameObject TransformToMove;
private Vector3 SpawnLocation;
private void Start()
{
//IL_000d: 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)
SpawnLocation = ((Component)this).gameObject.transform.position;
}
private void Update()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
TransformToMove.transform.position = SpawnLocation;
}
}
public class BallisticProjectileKillIfBelowSpeed : MonoBehaviour
{
public BallisticProjectile Projectile;
public float KillIfVelBelowThisMagnitude = 20f;
private void Update()
{
//IL_0023: 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)
if (((Vector3)(ref Projectile.m_velocity)).magnitude <= KillIfVelBelowThisMagnitude)
{
Projectile.m_velocity = Vector3.zero;
}
}
}
}
public class BreakActionMainHandFireSelector : MonoBehaviour
{
public BreakActionWeapon Weapon;
public Transform SelectorSwitch;
public Vector3 PosSingleFire;
public Vector3 PosMultiFire;
public bool SwapsTrigger = false;
public Transform SecondTrigger;
public float SecondTriggerPulledAngle = 20f;
private Transform OriginalTrigger;
private float OriginalTriggerPulled;
private void Awake()
{
OriginalTrigger = Weapon.Triggers[0];
OriginalTriggerPulled = Weapon.TriggerPulled;
}
private void Update()
{
//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)
FVRViveHand hand = ((FVRInteractiveObject)Weapon).m_hand;
if (!((Object)(object)hand == (Object)null) && ((hand.IsInStreamlinedMode && hand.Input.AXButtonDown) || (!hand.IsInStreamlinedMode && hand.Input.TouchpadDown && ((Vector2)(ref hand.Input.TouchpadAxes)).magnitude > 0.2f && Vector2.Angle(hand.Input.TouchpadAxes, Vector2.down) <= 45f)))
{
SwapFiremodes();
}
}
public void SwapFiremodes()
{
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
((FVRFireArm)Weapon).PlayAudioEvent((FirearmAudioEventType)15, 1f);
if (Weapon.FireAllBarrels)
{
Weapon.FireAllBarrels = false;
SelectorSwitch.localPosition = PosSingleFire;
if (SwapsTrigger)
{
Weapon.Triggers[0] = OriginalTrigger;
Weapon.TriggerPulled = OriginalTriggerPulled;
}
}
else if (!Weapon.FireAllBarrels)
{
Weapon.FireAllBarrels = true;
SelectorSwitch.localPosition = PosMultiFire;
if (SwapsTrigger)
{
Weapon.Triggers[0] = SecondTrigger;
Weapon.TriggerPulled = SecondTriggerPulledAngle;
}
}
}
}
namespace ShermanJumbo
{
public class BreakActionSpeedloaderInsertTrigger : MonoBehaviour
{
public BreakActionWeapon Weapon;
}
public class BreakActionSpeedloaderTrigger : MonoBehaviour
{
public FVRFireArmMagazine Loader;
private void OnTriggerEnter(Collider collider)
{
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_00ff: 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_010d: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)Loader != (Object)null) || !((Object)(object)Loader.FireArm == (Object)null) || !((Object)(object)((FVRPhysicalObject)Loader).QuickbeltSlot == (Object)null) || !((Object)(object)((Component)collider).gameObject.GetComponent<BreakActionSpeedloaderInsertTrigger>() != (Object)null))
{
return;
}
BreakActionSpeedloaderInsertTrigger component = ((Component)collider).gameObject.GetComponent<BreakActionSpeedloaderInsertTrigger>();
BreakActionWeapon weapon = component.Weapon;
if (((FVRFireArm)weapon).RoundType != Loader.RoundType || weapon.m_isLatched)
{
return;
}
for (int i = 0; i < weapon.Barrels.Length; i++)
{
if (Loader.HasARound() && !weapon.Barrels[i].Chamber.IsFull)
{
FVRLoadedRound val = Loader.RemoveRound(0);
Transform transform = Loader.DisplayBullets[Mathf.Clamp(0, Loader.DisplayBullets.Length - 1, i)].transform;
weapon.Barrels[i].Chamber.Autochamber(val.LR_Class, transform.position, transform.rotation);
((FVRFireArm)weapon).PlayAudioEvent((FirearmAudioEventType)20, 1f);
}
}
}
}
public class CSGCapTrigger : FVRInteractiveObject
{
public CappedStickyGrenade Grenade;
public override void SimpleInteraction(FVRViveHand hand)
{
((FVRInteractiveObject)this).SimpleInteraction(hand);
if (!Grenade.m_isArmed)
{
Grenade.Arm();
}
}
}
public class CSGDestroyNotifier : MonoBehaviour
{
public delegate void DestroyedAction();
public event DestroyedAction OnDestroyed;
private void OnDestroy()
{
if (this.OnDestroyed != null)
{
this.OnDestroyed();
}
}
}
public class CannonballSecondaryRenderer : MonoBehaviour
{
public Renderer Rend;
public CannonBall Cannonball;
private void Update()
{
if (Cannonball.TurnsOffRends && !Cannonball.hasTurnedOffRends)
{
Rend.enabled = false;
}
}
}
public class CappedStickyGrenade : FVRPhysicalObject
{
[Serializable]
public class CSGDetonationStage
{
public bool HasFired = false;
public float FireWhenFuseHits = 0f;
public GameObject[] PrefabToSpawn;
}
[Header("Grenade Settings")]
public Rigidbody grenadeRigidbody;
public bool m_isArmed = false;
public float FuseTime = 0f;
public List<GameObject> SpawnOnSplode;
public AudioEvent ArmedSound;
public int IFF;
private float m_fuseTime = 0f;
private bool m_hasSploded = false;
public bool UsesStagedDetonation = false;
public CSGDetonationStage[] DetonationStages;
[Header("Cap Settings")]
public bool UsesCapSystem = false;
public GameObject DummyCap;
public GameObject CapPrefab;
public Transform CapPrefabSpawnPos;
[Header("Sticky Grenade Settings")]
public bool isStickyGrenade = true;
public Collider stickyCollider;
public float stickingDistance = 0.1f;
public LayerMask stickyLayers;
public float embeddingDistance = 0.02f;
public bool playStickSoundForRigidbodiesOnly = true;
public AudioEvent stickSounds;
public float minimumStickVelocity = 2f;
public float regrabActivationDelay = 0.5f;
public float massWhileStuck = 10f;
private bool wasHeld = false;
private bool armChecked = false;
private bool shouldCheckVelocity = false;
private bool hasReleasedLever = false;
private bool isSticking = false;
private bool canStick = false;
private float timeSinceRelease = 0f;
private GameObject parentObject;
private Vector3 savedPosition;
private Quaternion savedRotation;
private Vector3 savedScale;
private FVRInteractiveObject interactiveObject;
private bool isCookingCoroutineRunning = false;
[Header("Extra Settings")]
public bool UsesArmedPfx = false;
public ParticleSystem[] Pfx;
public float ActivateParticlesWhenFuseHits = 3f;
private bool HasActivatedParticles = false;
public bool PlaysAnimationOnArm = false;
public Animator Animator;
public string ArmingAnimationNode = "animation";
public bool PlaysSoundWhileArmed = false;
public AudioSource ArmedSounds;
public float ActivateSoundsWhenFuseHits = 0f;
private bool HasPlayedArmedSounds = false;
private void Start()
{
interactiveObject = ((Component)this).GetComponent<FVRInteractiveObject>();
if (UsesArmedPfx)
{
ParticleSystem[] pfx = Pfx;
foreach (ParticleSystem val in pfx)
{
if (val.isPlaying)
{
val.Stop();
}
}
}
if (PlaysSoundWhileArmed && ArmedSounds.isPlaying)
{
ArmedSounds.Stop();
}
}
public override void UpdateInteraction(FVRViveHand hand)
{
((FVRPhysicalObject)this).UpdateInteraction(hand);
IFF = GM.CurrentPlayerBody.GetPlayerIFF();
}
public override void FVRUpdate()
{
//IL_030f: Unknown result type (might be due to invalid IL or missing references)
//IL_0314: Unknown result type (might be due to invalid IL or missing references)
//IL_0453: Unknown result type (might be due to invalid IL or missing references)
//IL_045e: Unknown result type (might be due to invalid IL or missing references)
((FVRPhysicalObject)this).FVRUpdate();
if (!armChecked && m_isArmed)
{
armChecked = true;
shouldCheckVelocity = true;
if (isStickyGrenade)
{
EnableStickyCollider();
}
}
if (!wasHeld && ((FVRInteractiveObject)this).IsHeld)
{
timeSinceRelease = 0f;
if (m_isArmed)
{
EnableStickyCollider();
}
shouldCheckVelocity = m_isArmed;
wasHeld = true;
canStick = true;
isSticking = false;
FixedJoint component = ((Component)this).GetComponent<FixedJoint>();
if ((Object)(object)component != (Object)null)
{
Object.Destroy((Object)(object)component);
grenadeRigidbody.isKinematic = false;
grenadeRigidbody.detectCollisions = true;
grenadeRigidbody.useGravity = true;
grenadeRigidbody.constraints = (RigidbodyConstraints)0;
Debug.Log((object)"FixedJoint grenade unstuck upon being picked up.");
}
else if ((Object)(object)((Component)this).transform.parent != (Object)null && ((Object)((Component)((Component)this).transform.parent).gameObject).name == "DummyParent")
{
GameObject gameObject = ((Component)((Component)this).transform.parent).gameObject;
((Component)this).transform.SetParent((Transform)null, true);
Object.Destroy((Object)(object)gameObject);
grenadeRigidbody.isKinematic = false;
grenadeRigidbody.detectCollisions = true;
grenadeRigidbody.useGravity = true;
grenadeRigidbody.constraints = (RigidbodyConstraints)0;
Debug.Log((object)"Static-stuck grenade unstuck upon being picked up.");
}
if (isStickyGrenade)
{
DisableStickyColliderTemporarily();
}
}
if (wasHeld && !((FVRInteractiveObject)this).IsHeld)
{
isSticking = false;
wasHeld = false;
}
if (m_isArmed || !((FVRInteractiveObject)this).IsHeld)
{
DisableMeleeDamage((FVRPhysicalObject)(object)this);
}
else
{
EnableMeleeDamage((FVRPhysicalObject)(object)this);
}
if (!m_isArmed)
{
return;
}
m_fuseTime -= Time.deltaTime;
if (m_fuseTime < ActivateParticlesWhenFuseHits && !HasActivatedParticles)
{
HasActivatedParticles = true;
ParticleSystem[] pfx = Pfx;
foreach (ParticleSystem val in pfx)
{
val.Play();
}
}
if (m_fuseTime < ActivateSoundsWhenFuseHits && !HasPlayedArmedSounds)
{
HasPlayedArmedSounds = true;
ArmedSounds.Play();
}
if (m_fuseTime <= 0.05f)
{
if (!m_hasSploded)
{
m_hasSploded = true;
ParticleSystem[] pfx2 = Pfx;
foreach (ParticleSystem val2 in pfx2)
{
if (val2.isPlaying)
{
val2.Stop();
}
}
for (int k = 0; k < SpawnOnSplode.Count; k++)
{
GameObject val3 = Object.Instantiate<GameObject>(SpawnOnSplode[k], ((Component)this).transform.position, Quaternion.identity);
Explosion component2 = val3.GetComponent<Explosion>();
if ((Object)(object)component2 != (Object)null)
{
component2.IFF = IFF;
}
ExplosionSound component3 = val3.GetComponent<ExplosionSound>();
if ((Object)(object)component3 != (Object)null)
{
component3.IFF = IFF;
}
GrenadeExplosion component4 = val3.GetComponent<GrenadeExplosion>();
if ((Object)(object)component4 != (Object)null)
{
component4.IFF = IFF;
}
}
}
else
{
if (((FVRInteractiveObject)this).IsHeld)
{
FVRViveHand hand = ((FVRInteractiveObject)this).m_hand;
((FVRInteractiveObject)this).m_hand.ForceSetInteractable((FVRInteractiveObject)null);
((FVRInteractiveObject)this).EndInteraction(hand);
}
Object.Destroy((Object)(object)((Component)this).gameObject);
}
}
if (!UsesStagedDetonation)
{
return;
}
CSGDetonationStage[] detonationStages = DetonationStages;
foreach (CSGDetonationStage cSGDetonationStage in detonationStages)
{
if (!cSGDetonationStage.HasFired && m_fuseTime <= cSGDetonationStage.FireWhenFuseHits)
{
cSGDetonationStage.HasFired = true;
GameObject[] prefabToSpawn = cSGDetonationStage.PrefabToSpawn;
foreach (GameObject val4 in prefabToSpawn)
{
Object.Instantiate<GameObject>(val4, ((Component)this).transform.position, ((Component)this).transform.rotation);
}
}
}
}
public override void FVRFixedUpdate()
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
((FVRPhysicalObject)this).FVRFixedUpdate();
if (shouldCheckVelocity && ((FVRInteractiveObject)this).IsHeld)
{
Vector3 velocity = grenadeRigidbody.velocity;
if (((Vector3)(ref velocity)).magnitude >= minimumStickVelocity)
{
canStick = true;
}
else
{
canStick = false;
}
}
}
private void DisableMeleeDamage(FVRPhysicalObject physicalObject)
{
if (physicalObject.MP != null && physicalObject.MP.IsMeleeWeapon)
{
physicalObject.MP.IsMeleeWeapon = false;
}
}
private void EnableMeleeDamage(FVRPhysicalObject physicalObject)
{
if (physicalObject.MP != null && !physicalObject.MP.IsMeleeWeapon)
{
physicalObject.MP.IsMeleeWeapon = true;
}
}
private void OnCollisionEnter(Collision collision)
{
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: 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_0103: Unknown result type (might be due to invalid IL or missing references)
if (!m_isArmed || isSticking || !isStickyGrenade || !((Object)(object)stickyCollider != (Object)null) || (Object)(object)collision.gameObject.GetComponent<BreakableGlass>() != (Object)null || (Object)(object)collision.gameObject.GetComponent<PinnedGrenade>() != (Object)null || (Object)(object)collision.gameObject.GetComponent<PinnedGrenadePin>() != (Object)null || (Object)(object)collision.gameObject.GetComponent<SosigWeapon>() != (Object)null)
{
return;
}
ContactPoint[] contacts = collision.contacts;
for (int i = 0; i < contacts.Length; i++)
{
ContactPoint contact = contacts[i];
if (!((Object)(object)((ContactPoint)(ref contact)).thisCollider == (Object)(object)stickyCollider))
{
continue;
}
if ((LayerMask.op_Implicit(stickyLayers) & (1 << collision.gameObject.layer)) == 0 || !IsContactPointWithinStickingDistance(((ContactPoint)(ref contact)).point))
{
break;
}
isSticking = true;
StickToSurface(collision, contact);
PlayStickingSound(collision);
parentObject = collision.gameObject;
if ((Object)(object)parentObject != (Object)null)
{
CSGDestroyNotifier cSGDestroyNotifier = parentObject.GetComponent<CSGDestroyNotifier>();
if ((Object)(object)cSGDestroyNotifier == (Object)null)
{
cSGDestroyNotifier = parentObject.AddComponent<CSGDestroyNotifier>();
}
cSGDestroyNotifier.OnDestroyed += OnDestroyUnstickGrenade;
}
break;
}
}
private bool IsContactPointWithinStickingDistance(Vector3 contactPoint)
{
//IL_0007: 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_000d: 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_000f: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = stickyCollider.ClosestPoint(contactPoint);
float num = Vector3.Distance(contactPoint, val);
return num < stickingDistance;
}
private void StickToSurface(Collision collision, ContactPoint contact)
{
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_014f: Expected O, but got Unknown
//IL_0158: Unknown result type (might be due to invalid IL or missing references)
//IL_016f: Unknown result type (might be due to invalid IL or missing references)
//IL_01be: Unknown result type (might be due to invalid IL or missing references)
//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
//IL_01da: Unknown result type (might be due to invalid IL or missing references)
//IL_01df: 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_01fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0205: Unknown result type (might be due to invalid IL or missing references)
//IL_0217: Unknown result type (might be due to invalid IL or missing references)
//IL_021c: Unknown result type (might be due to invalid IL or missing references)
//IL_021d: 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_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)stickyCollider == (Object)null)
{
return;
}
if ((Object)(object)interactiveObject != (Object)null && interactiveObject.IsHeld)
{
interactiveObject.ForceBreakInteraction();
}
savedPosition = ((Component)this).transform.position;
savedRotation = ((Component)this).transform.rotation;
Vector3 lossyScale = ((Component)this).transform.lossyScale;
Rigidbody rigidbody = collision.rigidbody;
Vector3 val = ((ContactPoint)(ref contact)).normal * embeddingDistance;
if ((Object)(object)rigidbody != (Object)null)
{
((Component)this).transform.position = ((ContactPoint)(ref contact)).point + val;
FixedJoint component = ((Component)this).GetComponent<FixedJoint>();
if ((Object)(object)component != (Object)null)
{
Object.Destroy((Object)(object)component);
}
FixedJoint val2 = ((Component)this).gameObject.AddComponent<FixedJoint>();
((Joint)val2).connectedBody = rigidbody;
((Joint)val2).breakForce = float.MaxValue;
((Joint)val2).breakTorque = float.MaxValue;
grenadeRigidbody.useGravity = false;
grenadeRigidbody.isKinematic = false;
grenadeRigidbody.constraints = (RigidbodyConstraints)0;
grenadeRigidbody.mass = massWhileStuck;
SetCollidersToLayer(stickyCollider, "NoCol");
}
else
{
GameObject val3 = new GameObject("DummyParent");
val3.transform.position = ((ContactPoint)(ref contact)).point;
val3.transform.rotation = collision.transform.rotation;
grenadeRigidbody.isKinematic = true;
val3.transform.SetParent(collision.transform, true);
((Component)this).transform.SetParent(val3.transform, false);
((Component)this).transform.localScale = new Vector3(lossyScale.x / ((Component)this).transform.lossyScale.x, lossyScale.y / ((Component)this).transform.lossyScale.y, lossyScale.z / ((Component)this).transform.lossyScale.z);
((Component)this).transform.position = ((ContactPoint)(ref contact)).point + val;
((Component)this).transform.rotation = savedRotation;
}
}
private void EnableStickyCollider()
{
if ((Object)(object)stickyCollider != (Object)null)
{
stickyCollider.enabled = true;
}
}
private void DisableStickyColliderTemporarily()
{
if ((Object)(object)stickyCollider != (Object)null)
{
stickyCollider.enabled = false;
}
((MonoBehaviour)this).StartCoroutine(ReenableStickyColliderAfterDelay());
}
private IEnumerator ReenableStickyColliderAfterDelay()
{
yield return (object)new WaitForSeconds(regrabActivationDelay);
EnableStickyCollider();
}
private void PlayStickingSound(Collision collision)
{
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
if ((playStickSoundForRigidbodiesOnly && (Object)(object)collision.rigidbody != (Object)null) || !playStickSoundForRigidbodiesOnly)
{
SM.PlayCoreSound((FVRPooledAudioType)10, stickSounds, ((Component)this).transform.position);
}
}
private void OnDestroyUnstickGrenade()
{
if ((Object)(object)this == (Object)null)
{
return;
}
if ((Object)(object)parentObject != (Object)null)
{
CSGDestroyNotifier component = parentObject.GetComponent<CSGDestroyNotifier>();
if ((Object)(object)component != (Object)null)
{
component.OnDestroyed -= OnDestroyUnstickGrenade;
}
parentObject = null;
}
FixedJoint component2 = ((Component)this).GetComponent<FixedJoint>();
if ((Object)(object)component2 != (Object)null)
{
Object.Destroy((Object)(object)component2);
}
else if ((Object)(object)((Component)this).transform.parent != (Object)null)
{
((Component)this).transform.SetParent((Transform)null);
}
if ((Object)(object)grenadeRigidbody != (Object)null)
{
grenadeRigidbody.isKinematic = false;
grenadeRigidbody.detectCollisions = true;
grenadeRigidbody.useGravity = true;
grenadeRigidbody.constraints = (RigidbodyConstraints)0;
}
isSticking = false;
if ((Object)(object)stickyCollider != (Object)null)
{
stickyCollider.enabled = false;
}
canStick = false;
}
private void SetCollidersToLayer(Collider collider, string layer)
{
((Component)collider).gameObject.layer = LayerMask.NameToLayer(layer);
}
private void OnDestroy()
{
if ((Object)(object)parentObject != (Object)null)
{
CSGDestroyNotifier component = parentObject.GetComponent<CSGDestroyNotifier>();
if ((Object)(object)component != (Object)null)
{
component.OnDestroyed -= OnDestroyUnstickGrenade;
}
}
}
public void Arm()
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_007b: 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)
if (!m_isArmed)
{
m_isArmed = true;
m_fuseTime = FuseTime;
SM.PlayCoreSound((FVRPooledAudioType)10, ArmedSound, ((Component)this).transform.position);
if (PlaysAnimationOnArm)
{
Animator.Play(ArmingAnimationNode);
}
if (UsesCapSystem)
{
DummyCap.SetActive(false);
Object.Instantiate<GameObject>(CapPrefab, CapPrefabSpawnPos.position, CapPrefabSpawnPos.rotation);
}
}
}
}
public class ChamberDependentParticlesAndSounds : MonoBehaviour
{
public FVRFireArmChamber ChamberToRead;
public ParticleSystem ParticlesToEnable;
public AudioSource SoundsToEnable;
private void Update()
{
if (ChamberToRead.IsFull)
{
if (!ParticlesToEnable.isPlaying)
{
ParticlesToEnable.Play();
}
if (!SoundsToEnable.isPlaying)
{
SoundsToEnable.Play();
}
}
else
{
ParticlesToEnable.Stop();
SoundsToEnable.Stop();
}
}
}
public class ClosedBoltBeltFedDualFeedFix : MonoBehaviour
{
public ClosedBoltWeapon Weapon;
public ClosedBoltMagEjectionTrigger MagGrabTrigger;
public Vector3 TriggerPosForBeltBox;
public Vector3 ScaleForBeltBoxTrigger;
private Vector3 TriggerPosForMag;
private Vector3 ScaleForMagTrigger;
private void Start()
{
//IL_000d: 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_0023: 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)
TriggerPosForMag = ((FVRInteractiveObject)MagGrabTrigger).Transform.localPosition;
ScaleForMagTrigger = ((FVRInteractiveObject)MagGrabTrigger).Transform.localScale;
}
private void Update()
{
//IL_0044: 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_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
FVRFireArmMagazine magazine = ((FVRFireArm)Weapon).Magazine;
ClosedBoltMagEjectionTrigger magGrabTrigger = MagGrabTrigger;
if ((Object)(object)magazine == (Object)null)
{
return;
}
if (!magazine.IsBeltBox)
{
((Component)magGrabTrigger).gameObject.SetActive(true);
((FVRInteractiveObject)magGrabTrigger).Transform.localPosition = TriggerPosForMag;
((FVRInteractiveObject)magGrabTrigger).Transform.localScale = ScaleForMagTrigger;
}
if (magazine.IsBeltBox)
{
if (!((FVRFireArm)Weapon).ConnectedToBox)
{
((Component)magGrabTrigger).gameObject.SetActive(true);
((FVRInteractiveObject)magGrabTrigger).Transform.localPosition = TriggerPosForBeltBox;
((FVRInteractiveObject)magGrabTrigger).Transform.localScale = ScaleForBeltBoxTrigger;
}
else
{
((Component)MagGrabTrigger).gameObject.SetActive(false);
}
}
}
}
public class ClosedBoltMagReleaseSelector : MonoBehaviour
{
public ClosedBoltWeapon Gun;
public Vector3 MagReleaseUnpress_Safe;
public Vector3 MagReleaseUnpress_NotSafe;
private void Update()
{
//IL_0018: 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_0046: 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)
if ((int)Gun.FireSelector_Modes[Gun.m_fireSelectorMode].ModeType == 0)
{
Gun.MagReleaseUnpressed = MagReleaseUnpress_Safe;
}
else
{
Gun.MagReleaseUnpressed = MagReleaseUnpress_NotSafe;
}
}
}
public class ClosedBoltPokeToChamberRound : FVRInteractiveObject
{
public ClosedBoltWeapon Weapon;
public FVRFireArmChamber Chamber;
public override void Poke(FVRViveHand hand)
{
if (((Object)(object)((FVRInteractiveObject)Weapon).m_hand == (Object)null || (Object)(object)hand != (Object)(object)((FVRInteractiveObject)Weapon).m_hand) && !Chamber.IsFull)
{
Weapon.Bolt.ImpartFiringImpulse();
}
}
}
public class Commando : FVRFireArm
{
[Serializable]
public class CommandoMovingPart
{
public MovableObjectPart ObjectPart;
public E_State DesiredState;
}
[Header("Commando")]
public FVRFireArmChamber[] CommandoChambers;
public Transform[] CommandoMuzzles;
public int CurrentChamber = 0;
public bool AlsoPlaysSecondFireSound = true;
public AudioEvent SecondFireSound;
public Transform SecondFireSoundPosition;
public bool DeletesCartridgeOnFire = true;
public bool DestroyWhenEmpty = false;
public float KillDelay = 30f;
public bool IsEmpty = false;
public bool UseEnableDisablePerChamberSystem = true;
public GameObject[] EnableIfCorrespondingChamberIsSpent;
public GameObject[] DisableIfCorrespondingChamberIsSpent;
public Transform Trigger;
public float Trigger_ForwardValue;
public float Trigger_RearwardValue;
public Axis TriggerAxis;
public InterpStyle TriggerInterpStyle = (InterpStyle)1;
private float m_triggerFloat;
[Header("Moving Parts Stuff")]
public bool UsesMovingPartSystem = false;
public bool AllMovingPartsReady = false;
public CommandoMovingPart[] MovingParts;
public override void Awake()
{
((FVRFireArm)this).Awake();
FVRFireArmChamber[] commandoChambers = CommandoChambers;
foreach (FVRFireArmChamber item in commandoChambers)
{
base.FChambers.Add(item);
}
}
public override void UpdateInteraction(FVRViveHand hand)
{
//IL_004a: 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)
((FVRPhysicalObject)this).UpdateInteraction(hand);
m_triggerFloat = hand.Input.TriggerFloat;
if ((Object)(object)Trigger != (Object)null)
{
((FVRPhysicalObject)this).SetAnimatedComponent(Trigger, Mathf.Lerp(Trigger_ForwardValue, Trigger_RearwardValue, m_triggerFloat), TriggerInterpStyle, TriggerAxis);
}
if (!((FVRPhysicalObject)this).IsAltHeld && hand.Input.TriggerDown && ((FVRInteractiveObject)this).m_hasTriggeredUpSinceBegin && CurrentChamber <= CommandoChambers.Length - 1)
{
Fire();
}
IsEmpty = true;
FVRFireArmChamber[] commandoChambers = CommandoChambers;
foreach (FVRFireArmChamber val in commandoChambers)
{
if (val.IsFull && !val.IsSpent)
{
IsEmpty = false;
break;
}
}
if (IsEmpty && DestroyWhenEmpty)
{
Object.Destroy((Object)(object)((Component)this).gameObject, KillDelay);
}
}
public override Transform GetMuzzle()
{
return CommandoMuzzles[CurrentChamber];
}
public void Fire()
{
//IL_0104: Unknown result type (might be due to invalid IL or missing references)
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
if (!CommandoChambers[CurrentChamber].IsFull || CommandoChambers[CurrentChamber].IsSpent)
{
return;
}
if (UsesMovingPartSystem)
{
AllMovingPartsReady = true;
CommandoMovingPart[] movingParts = MovingParts;
foreach (CommandoMovingPart commandoMovingPart in movingParts)
{
if (commandoMovingPart.ObjectPart.State != commandoMovingPart.DesiredState)
{
AllMovingPartsReady = false;
}
}
if (!AllMovingPartsReady)
{
return;
}
}
FVRFireArmChamber val = CommandoChambers[CurrentChamber];
val.Fire();
((FVRFireArm)this).Fire(val, ((FVRFireArm)this).GetMuzzle(), true, 1f, -1f);
((FVRFireArm)this).FireMuzzleSmoke();
bool flag = ((FVRFireArm)this).IsTwoHandStabilized();
bool flag2 = (Object)(object)((FVRPhysicalObject)this).AltGrip != (Object)null;
bool flag3 = ((FVRFireArm)this).IsShoulderStabilized();
((FVRFireArm)this).Recoil(flag, flag2, flag3, (FVRFireArmRecoilProfile)null, 1f);
((FVRFireArm)this).PlayAudioGunShot(val.GetRound(), GM.CurrentPlayerBody.GetCurrentSoundEnvironment(), 1f);
if (AlsoPlaysSecondFireSound)
{
SM.PlayCoreSound((FVRPooledAudioType)0, SecondFireSound, ((Component)SecondFireSoundPosition).transform.position);
}
if (GM.CurrentSceneSettings.IsAmmoInfinite || GM.CurrentPlayerBody.IsInfiniteAmmo)
{
val.IsSpent = false;
val.UpdateProxyDisplay();
}
else if (DeletesCartridgeOnFire)
{
val.SetRound((FVRFireArmRound)null, false);
}
if (UseEnableDisablePerChamberSystem)
{
EnableIfCorrespondingChamberIsSpent[CurrentChamber].SetActive(true);
DisableIfCorrespondingChamberIsSpent[CurrentChamber].SetActive(false);
}
CurrentChamber++;
if (CurrentChamber >= CommandoChambers.Length)
{
CurrentChamber = 0;
}
}
public override List<FireArmRoundClass> GetChamberRoundList()
{
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
if (CommandoChambers[0].IsFull && !CommandoChambers[0].IsSpent)
{
List<FireArmRoundClass> list = new List<FireArmRoundClass>();
list.Add(CommandoChambers[0].GetRound().RoundClass);
return list;
}
return null;
}
public override void SetLoadedChambers(List<FireArmRoundClass> rounds)
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
FVRFireArmChamber[] commandoChambers = CommandoChambers;
foreach (FVRFireArmChamber val in commandoChambers)
{
if (rounds.Count > 0)
{
val.Autochamber(rounds[0]);
}
}
}
}
public class DemonadeProximityDetonate : MonoBehaviour
{
public MF2_Demonade Demonade;
public float ActivationDelay = 1f;
private float m_timetoDelay = 0f;
private bool isArmed = false;
private void Update()
{
if (m_timetoDelay < ActivationDelay)
{
m_timetoDelay += Time.deltaTime;
}
if (m_timetoDelay >= ActivationDelay)
{
isArmed = true;
}
}
private void OnTriggerEnter(Collider other)
{
if (isArmed)
{
string text = LayerMask.LayerToName(((Component)other).gameObject.layer);
if (Demonade.ExplodeOnContactLayerName == text)
{
Demonade.Explode();
}
}
}
}
public class DisableIfCurrentMagIsBeltBox : MonoBehaviour
{
public FVRFireArm Firearm;
public GameObject GameObjectToDisable;
private void Update()
{
GameObjectToDisable.SetActive(true);
}
}
public class Epoch : FVRFireArm
{
[Header("Epoch Component Params")]
public GameObject UnchargedBolt;
public GameObject ChargedBolt;
private bool HasRound = false;
[Header("Epoch Trigger Params")]
public float TriggerBreakPoint;
public Transform Trigger;
public float Trigger_ForwardValue;
public float Trigger_RearwardValue;
public Axis TriggerAxis;
public InterpStyle TriggerInterpStyle = (InterpStyle)1;
private float TriggerHeldStartTime = 0f;
public float SafeHoldTime = 1f;
public float MaxUnsafeHoldTime = 3f;
public GameObject[] SelfDestructPrefabs;
private float m_triggerFloat;
private bool IsChargedToPowerful = false;
private float ManipulationFactor = 0f;
private float ManipulationFactor2 = 0f;
private bool HasStartedCharging = false;
[Header("Epoch Visual Params")]
public ParticleSystem ChargingParticles;
public ParticleSystem ChargedParticles;
public ParticleSystem FiringParticles;
public int NumberOfParticles;
public Transform MainChargeBars;
public Vector2 YScaleMainSafe;
public Vector2 YScaleMainUnsafe;
public Transform OpticChargeBar;
public Vector2 YScaleOptic;
public Vector2 YScaleOpticUnsafe;
[Header("Epoch Audio Params")]
public FVRTailSoundClass TailClass = (FVRTailSoundClass)8;
public AudioEvent ChargingClip;
public AudioEvent FullyChargedClip;
public AudioSource ChargeLoopAudio;
private bool HasPlayedFullyChargedSound = false;
public float MaxChargeLoopPitch = 1.5f;
private void Start()
{
ChargeLoopAudio.Stop();
ChargingParticles.Stop();
ChargedParticles.Stop();
}
public override void EndInteraction(FVRViveHand hand)
{
((FVRFireArm)this).EndInteraction(hand);
ManipulationFactor = 0f;
ManipulationFactor2 = 0f;
if (ChargingParticles.isPlaying)
{
ChargingParticles.Stop();
}
if (ChargedParticles.isPlaying)
{
ChargedParticles.Stop();
}
if (ChargeLoopAudio.isPlaying)
{
ChargeLoopAudio.Stop();
}
HasPlayedFullyChargedSound = false;
}
public override void UpdateInteraction(FVRViveHand hand)
{
//IL_009e: 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_0146: Unknown result type (might be due to invalid IL or missing references)
//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
//IL_021b: Unknown result type (might be due to invalid IL or missing references)
((FVRPhysicalObject)this).UpdateInteraction(hand);
m_triggerFloat = hand.Input.TriggerFloat;
if (IsChargedToPowerful && !ChargeLoopAudio.isPlaying)
{
ChargeLoopAudio.Play();
}
if (!IsChargedToPowerful && ChargeLoopAudio.isPlaying)
{
ChargeLoopAudio.Stop();
}
if ((Object)(object)Trigger != (Object)null)
{
((FVRPhysicalObject)this).SetAnimatedComponent(Trigger, Mathf.Lerp(Trigger_ForwardValue, Trigger_RearwardValue, m_triggerFloat), TriggerInterpStyle, TriggerAxis);
}
HasRound = true;
EpochMagazine epochMagazine = (EpochMagazine)(object)base.Magazine;
if ((Object)(object)epochMagazine == (Object)null || epochMagazine.NumOfRoundsRemaining == 0)
{
HasRound = false;
}
if (!((FVRPhysicalObject)this).IsAltHeld && m_triggerFloat >= TriggerBreakPoint && !HasStartedCharging && HasRound)
{
HasStartedCharging = true;
TriggerHeldStartTime = Time.time;
IsChargedToPowerful = false;
ManipulationFactor = 0f;
SM.PlayCoreSound((FVRPooledAudioType)0, ChargingClip, ((Component)this).transform.position);
}
if (!((FVRPhysicalObject)this).IsAltHeld && m_triggerFloat >= TriggerBreakPoint)
{
float num = Time.time - TriggerHeldStartTime;
if (num < SafeHoldTime)
{
ManipulationFactor = Mathf.Clamp01(num / SafeHoldTime);
}
if (num >= SafeHoldTime)
{
ManipulationFactor = 1f;
IsChargedToPowerful = true;
if (!HasPlayedFullyChargedSound)
{
SM.PlayCoreSound((FVRPooledAudioType)0, FullyChargedClip, ((Component)this).transform.position);
HasPlayedFullyChargedSound = true;
}
}
if (num >= SafeHoldTime && num < MaxUnsafeHoldTime)
{
if (!HasPlayedFullyChargedSound)
{
SM.PlayCoreSound((FVRPooledAudioType)0, FullyChargedClip, ((Component)this).transform.position);
HasPlayedFullyChargedSound = true;
}
ManipulationFactor = 1f;
IsChargedToPowerful = true;
ManipulationFactor2 = Mathf.Clamp01((num - SafeHoldTime) / (MaxUnsafeHoldTime - SafeHoldTime));
ChargeLoopAudio.pitch = 1f + ManipulationFactor2 * MaxChargeLoopPitch;
}
if (num >= MaxUnsafeHoldTime)
{
SelfDestruct(hand);
}
if (!ChargingParticles.isPlaying)
{
ChargingParticles.Play();
}
}
if (m_triggerFloat < TriggerBreakPoint && IsChargedToPowerful && !((FVRPhysicalObject)this).IsAltHeld)
{
Fire();
IsChargedToPowerful = false;
ManipulationFactor = 0f;
ManipulationFactor2 = 0f;
FiringParticles.Emit(NumberOfParticles);
ChargingParticles.Stop();
HasPlayedFullyChargedSound = false;
}
if (m_triggerFloat < TriggerBreakPoint && !IsChargedToPowerful)
{
ManipulationFactor = 0f;
if (ChargingParticles.isPlaying)
{
ChargingParticles.Stop();
}
HasPlayedFullyChargedSound = false;
HasStartedCharging = false;
TriggerHeldStartTime = Time.time;
}
UpdateAnimatedParts();
}
public void UpdateAnimatedParts()
{
//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_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_00ad: 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_00de: Unknown result type (might be due to invalid IL or missing references)
float num = YScaleMainSafe.x - YScaleMainSafe.y;
float num2 = YScaleMainUnsafe.x - YScaleMainUnsafe.y;
Vector3 localScale = ((Component)MainChargeBars).transform.localScale;
localScale.y = 1f - (ManipulationFactor * num + ManipulationFactor2 * num2);
((Component)MainChargeBars).transform.localScale = localScale;
float num3 = YScaleOptic.x - YScaleOptic.y;
float num4 = YScaleOpticUnsafe.x - YScaleOpticUnsafe.y;
Vector3 localScale2 = ((Component)OpticChargeBar).transform.localScale;
localScale2.y = 1f - (num3 * ManipulationFactor + ManipulationFactor2 * num4);
((Component)OpticChargeBar).transform.localScale = localScale2;
if (IsChargedToPowerful && !ChargedParticles.isPlaying)
{
ChargedParticles.Play();
}
if (!IsChargedToPowerful && ChargedParticles.isPlaying)
{
ChargedParticles.Stop();
}
}
public void Fire()
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: 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_00dd: 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_00f7: 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_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)
GameObject val = null;
if (IsChargedToPowerful)
{
val = Object.Instantiate<GameObject>(UnchargedBolt, ((FVRFireArm)this).GetMuzzle().position, ((FVRFireArm)this).GetMuzzle().rotation);
}
if (!IsChargedToPowerful)
{
val = Object.Instantiate<GameObject>(ChargedBolt, ((FVRFireArm)this).GetMuzzle().position, ((FVRFireArm)this).GetMuzzle().rotation);
}
BallisticProjectile component = val.GetComponent<BallisticProjectile>();
component.Fire(val.transform.forward, (FVRFireArm)(object)this);
HasPlayedFullyChargedSound = false;
((FVRFireArm)this).FireMuzzleSmoke();
bool flag = ((FVRFireArm)this).IsTwoHandStabilized();
bool flag2 = (Object)(object)((FVRPhysicalObject)this).AltGrip != (Object)null;
bool flag3 = ((FVRFireArm)this).IsShoulderStabilized();
((FVRFireArm)this).Recoil(flag, flag2, flag3, (FVRFireArmRecoilProfile)null, 1f);
base.m_pool_shot.PlayClip(base.AudioClipSet.Shots_Main, base.MuzzlePos.position, (AudioMixerGroup)null);
base.m_pool_tail.PlayClipPitchOverride(SM.GetTailSet(TailClass, GM.CurrentPlayerBody.GetCurrentSoundEnvironment()), ((FVRFireArm)this).GetMuzzle().position, base.AudioClipSet.TailPitchMod_Main, (AudioMixerGroup)null);
if (GM.CurrentSceneSettings.IsAmmoInfinite || GM.CurrentPlayerBody.IsInfiniteAmmo)
{
EpochMagazine epochMagazine = (EpochMagazine)(object)base.Magazine;
epochMagazine.NumOfRoundsRemaining++;
}
HasStartedCharging = false;
ChargeLoopAudio.pitch = 1f;
}
public void SelfDestruct(FVRViveHand hand)
{
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).EndInteraction(hand);
GameObject[] selfDestructPrefabs = SelfDestructPrefabs;
foreach (GameObject val in selfDestructPrefabs)
{
Object.Instantiate<GameObject>(val, ((Component)this).transform.position, ((Component)this).transform.rotation);
}
((FVRInteractiveObject)this).ForceBreakInteraction();
Object.Destroy((Object)(object)((Component)this).gameObject);
}
}
public class EpochMagazine : FVRFireArmMagazine
{
[Header("Epoch Cell Params")]
public int NumOfRoundsRemaining = 3;
}
public class FirearmFlyOutOfHand : MonoBehaviour
{
public FVRFireArm Gun;
public FVRFireArmChamber Chamber;
public float TriggerFloat = 0.85f;
protected bool IsSpent = false;
protected bool WasSpent = false;
public float Force = 30f;
public float Torque = 20f;
private void Update()
{
//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)
//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00e3: 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_010d: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_012e: Unknown result type (might be due to invalid IL or missing references)
IsSpent = Chamber.IsSpent;
if (IsSpent && !WasSpent && (Object)(object)((FVRInteractiveObject)Gun).m_hand != (Object)null && ((FVRInteractiveObject)Gun).m_hand.Input.TriggerFloat >= TriggerFloat && !Gun.IsTwoHandStabilized() && !Gun.IsForegripStabilized())
{
if ((Object)(object)((FVRInteractiveObject)Gun).m_hand != (Object)null)
{
((FVRInteractiveObject)Gun).m_hand.EndInteractionIfHeld((FVRInteractiveObject)(object)Gun);
((FVRInteractiveObject)Gun).ForceBreakInteraction();
}
((FVRPhysicalObject)Gun).RootRigidbody.AddForceAtPosition((-((Component)this).transform.forward + ((Component)this).transform.up + Random.onUnitSphere * 0.25f) * Force, Gun.MuzzlePos.position, (ForceMode)1);
((FVRPhysicalObject)Gun).RootRigidbody.AddRelativeTorque(Vector3.right * Torque, (ForceMode)1);
}
WasSpent = Chamber.IsSpent;
}
}
public class FirearmSpinnyBarrels : MonoBehaviour
{
public FVRFireArm Gun;
public GameObject SpinningBarrels;
public float SpinRate;
public dirType DirectionOfSpin;
public float DecelerationRate = 0.5f;
public float TriggerDeadzone = 0.01f;
private float currentSpinSpeed = 0f;
private bool TriggerPulled = false;
public AudioSource SpinnySounds;
public float SpinnySoundsVolume = 0.4f;
private void Awake()
{
if ((Object)(object)SpinnySounds != (Object)null)
{
SpinnySounds.volume = 0f;
}
}
private void Update()
{
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
//IL_0135: Unknown result type (might be due to invalid IL or missing references)
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
//IL_013d: Expected I4, but got Unknown
//IL_016b: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)SpinnySounds != (Object)null)
{
SpinnySounds.volume = currentSpinSpeed / SpinRate * SpinnySoundsVolume;
}
if ((Object)(object)Gun != (Object)null && (Object)(object)((FVRInteractiveObject)Gun).m_hand != (Object)null)
{
float triggerFloat = ((FVRInteractiveObject)Gun).m_hand.Input.TriggerFloat;
if (triggerFloat >= TriggerDeadzone)
{
if (!TriggerPulled)
{
TriggerPulled = true;
}
currentSpinSpeed = SpinRate;
}
else if (TriggerPulled)
{
TriggerPulled = false;
}
}
if (!TriggerPulled && currentSpinSpeed > 0f)
{
currentSpinSpeed -= DecelerationRate * Time.deltaTime;
if (currentSpinSpeed < 0f)
{
currentSpinSpeed = 0f;
}
}
if (currentSpinSpeed > 0f && (Object)(object)SpinningBarrels != (Object)null)
{
Vector3 zero = Vector3.zero;
int num = (int)DirectionOfSpin;
if (num >= 0 && num <= 2)
{
((Vector3)(ref zero))[num] = currentSpinSpeed * Time.deltaTime;
SpinningBarrels.transform.Rotate(zero);
}
else
{
Debug.LogWarning((object)"Invalid DirectionOfSpin value!");
}
}
}
}
public class GrenadeFuseTimeReadout : MonoBehaviour
{
public PinnedGrenade Grenade;
public Text Text;
public bool UseBetterVarTimeFuse = true;
public float[] FuzeTimes;
public float PitchStart = 1f;
public float PitchEnd = 2.5f;
private int FuzeTimeIndex = 0;
private void Update()
{
//IL_00fc: 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_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
if (Grenade.m_isLeverReleased)
{
float num = Grenade.m_fuseTime;
if (num < 0f)
{
num = 0f;
}
Text.text = num.ToString("F1") + "s";
if (UseBetterVarTimeFuse)
{
float num2 = Mathf.Clamp(1f - Grenade.m_fuseTime / Grenade.m_startFuseTime, 0f, 1f);
num2 = Mathf.Pow(num2, 2f);
if (Grenade.m_fuse_tick <= 0f)
{
Grenade.m_fuse_tick = Mathf.Lerp(Grenade.m_fuse_StartRefire, Grenade.m_fuse_EndRefire, num2);
float num3 = Mathf.Lerp(PitchStart, PitchEnd, num2);
SM.PlayCoreSoundOverrides((FVRPooledAudioType)0, Grenade.AudEvent_FusePulse, ((FVRInteractiveObject)Grenade).Transform.position, new Vector2(1f, 1f), new Vector2(num3, num3));
Grenade.FusePSystem.Emit(2);
}
else
{
PinnedGrenade grenade = Grenade;
grenade.m_fuse_tick -= Time.deltaTime;
}
}
}
if (!UseBetterVarTimeFuse)
{
return;
}
if ((Object)(object)((FVRInteractiveObject)Grenade).m_hand != (Object)null && ((((FVRInteractiveObject)Grenade).m_hand.IsInStreamlinedMode && ((FVRInteractiveObject)Grenade).m_hand.Input.BYButtonDown) || (((FVRInteractiveObject)Grenade).m_hand.Input.TouchpadDown && ((Vector2)(ref ((FVRInteractiveObject)Grenade).m_hand.Input.TouchpadAxes)).magnitude > 0.2f && Vector2.Angle(((FVRInteractiveObject)Grenade).m_hand.Input.TouchpadAxes, Vector2.up) <= 45f)))
{
if (FuzeTimeIndex < FuzeTimes.Length - 1)
{
FuzeTimeIndex++;
}
else
{
FuzeTimeIndex = 0;
}
}
Grenade.DefaultFuse.x = FuzeTimes[FuzeTimeIndex];
Grenade.DefaultFuse.y = FuzeTimes[FuzeTimeIndex];
if (!Grenade.m_isLeverReleased)
{
float num4 = FuzeTimes[FuzeTimeIndex];
Grenade.DefaultFuse.x = num4;
Grenade.DefaultFuse.y = num4;
Grenade.m_startFuseTime = num4;
Grenade.m_fuseTime = num4;
Text.text = num4.ToString("F1") + "s";
}
}
}
public class GrenadeParticlesIfArmed : MonoBehaviour
{
public PinnedGrenade Grenade;
public ParticleSystem[] Particles;
public AudioSource ArmedSounds;
public bool ReleaseLeverOnPinPull = true;
private bool m_hasReleasedLever = false;
private bool m_hasArmed = false;
private bool m_hasExploded = false;
private void Start()
{
StopParticles();
ArmedSounds.Stop();
}
private void Update()
{
if ((Object)(object)Grenade == (Object)null || Particles == null || (Object)(object)ArmedSounds == (Object)null)
{
return;
}
bool isPinPulled = Grenade.m_isPinPulled;
bool isLeverReleased = Grenade.m_isLeverReleased;
bool hasSploded = Grenade.m_hasSploded;
if (ReleaseLeverOnPinPull && isPinPulled && !m_hasReleasedLever)
{
m_hasReleasedLever = true;
Grenade.ReleaseLever();
}
if (isLeverReleased && !m_hasArmed)
{
m_hasArmed = true;
PlayParticles();
if (!ArmedSounds.isPlaying)
{
ArmedSounds.Play();
}
}
if (hasSploded && !m_hasExploded)
{
m_hasExploded = true;
StopParticles();
if (ArmedSounds.isPlaying)
{
ArmedSounds.Stop();
}
}
}
private void PlayParticles()
{
if (Particles == null)
{
return;
}
ParticleSystem[] particles = Particles;
foreach (ParticleSystem val in particles)
{
if ((Object)(object)val != (Object)null && !val.isPlaying)
{
val.Play();
}
}
}
private void StopParticles()
{
if (Particles == null)
{
return;
}
ParticleSystem[] particles = Particles;
foreach (ParticleSystem val in particles)
{
if ((Object)(object)val != (Object)null && val.isPlaying)
{
val.Stop();
}
}
}
}
public class GrenadeTouchpadArm : MonoBehaviour
{
public PinnedGrenade Grenade;
private FVRViveHand Hand;
private void Update()
{
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
Hand = ((FVRInteractiveObject)Grenade).m_hand;
if ((Object)(object)Hand == (Object)null)
{
return;
}
Vector2 touchpadAxes = Hand.Input.TouchpadAxes;
if ((!Hand.IsInStreamlinedMode || !Hand.Input.AXButtonPressed) && (!Hand.Input.TouchpadPressed || !(((Vector2)(ref touchpadAxes)).magnitude > 0.2f) || !(Vector2.Angle(touchpadAxes, Vector2.down) <= 45f)))
{
return;
}
foreach (PinnedGrenadeRing ring in Grenade.m_rings)
{
ring.PopOutRoutine();
}
Grenade.ReleaseLever();
}
}
public class LAPDLaserAsAttachment : MonoBehaviour
{
public LAPD2019Laser Laser;
private void Awake()
{
Laser.m_isOn = true;
}
}
public class MagazineDeleteIfEmpty : MonoBehaviour
{
public FVRFireArmMagazine Magazine;
private void Update()
{
if (!((Object)(object)Magazine.FireArm == (Object)null) && !Magazine.HasARound())
{
FVRFireArmMagazine magazine = Magazine;
Magazine.FireArm.EjectMag(false);
Object.Destroy((Object)(object)((Component)magazine).gameObject);
}
}
}
}
namespace ShermanJumbo.GM94
{
[BepInPlugin("ShermanJumbo.GM94", "GM94", "0.0.3")]
[BepInProcess("h3vr.exe")]
[Description("Built with MeatKit")]
[BepInDependency("h3vr.otherloader", "1.3.0")]
public class GM94Plugin : 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(), "ShermanJumbo.GM94");
OtherLoader.RegisterDirectLoad(BasePath, "ShermanJumbo.GM94", "", "shermanjumbo_gm-94", "", "");
}
}
}
namespace ShermanJumbo
{
public class MinigunExtraBarrelVisual : MonoBehaviour
{
public Minigun Minigun;
public Transform Barrel;
private void Update()
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
Barrel.localEulerAngles = new Vector3(0f, 0f, Minigun.m_foreRot);
}
}
}
public class MinigunMultipleMuzzles : MonoBehaviour
{
public Minigun Minigun;
private int CurrentRoundCount;
private int PreviousRoundCount;
public Transform[] Muzzles;
private int MuzzleIndex;
private void Update()
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
MinigunBox val = (MinigunBox)((FVRFireArm)Minigun).Magazine;
if ((Object)(object)val == (Object)null)
{
return;
}
CurrentRoundCount = val.NumBulletsLeft;
if (CurrentRoundCount < PreviousRoundCount)
{
MuzzleIndex++;
if (MuzzleIndex > Muzzles.Length - 1)
{
MuzzleIndex = 0;
}
((FVRFireArm)Minigun).MuzzlePos = Muzzles[MuzzleIndex];
((FVRFireArm)Minigun).UpdateCurrentMuzzle();
}
PreviousRoundCount = CurrentRoundCount;
}
}
namespace ShermanJumbo
{
public class OpenBoltFakeChamberDisplay : MonoBehaviour
{
public OpenBoltReceiver Gun;
public OpenBoltReceiverBolt Bolt;
public GameObject DisplayRound;
private void Update()
{
//IL_0032: 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_0048: Invalid comparison between Unknown and I4
if ((Object)(object)((FVRFireArm)Gun).Magazine != (Object)null && ((FVRFireArm)Gun).Magazine.HasARound() && (int)Bolt.CurPos != 0 && (int)Bolt.CurPos != 1)
{
DisplayRound.SetActive(true);
}
else
{
DisplayRound.SetActive(false);
}
}
}
public class DoubleBarrelClosedBoltWeaponBolt : FVRInteractiveObject
{
public enum BoltPos
{
Forward,
ForwardToMid,
Locked,
LockedToRear,
Rear
}
[Header("Bolt")]
public DoubleBarreledClosedBoltWeapon Weapon;
public float Speed_Forward;
public float Speed_Rearward;
public float Speed_Held;
public float SpringStiffness = 5f;
public BoltPos CurPos;
public BoltPos LastPos;
public Transform Point_Bolt_Forward;
public Transform Point_Bolt_LockPoint;
public Transform Point_Bolt_Rear;
public Transform Point_Bolt_SafetyLock;
public bool HasLastRoundBoltHoldOpen = true;
public bool UsesAKSafetyLock;
public bool DoesClipHoldBoltOpen = true;
private float m_curBoltSpeed;
private float m_boltZ_current;
private float m_boltZ_heldTarget;
private float m_boltZ_forward;
private float m_boltZ_lock;
private float m_boltZ_rear;
private float m_boltZ_safetylock;
private bool m_isBoltLocked;
private bool m_isHandleHeld;
private float m_handleLerp;
public bool HasBoltCatchReleaseButton;
private bool m_isBoltCatchHeldOnHandle;
private bool m_isReleaseCatchHeldOnHandle;
[Header("Reciprocating Barrel")]
public bool HasReciprocatingBarrel;
public Transform Barrel;
public Vector3 BarrelForward;
public Vector3 BarrelRearward;
private bool m_isBarrelReciprocating;
[Header("Hammer")]
public bool HasHammer;
public Transform Hammer;
public Vector3 HammerForward;
public Vector3 HammerRearward;
[Header("Rotating Bit")]
public bool HasRotatingPart;
public Transform RotatingPart;
public Vector3 RotatingPartNeutralEulers;
public Vector3 RotatingPartLeftEulers;
public Vector3 RotatingPartRightEulers;
[Header("Z Rot Part")]
public bool HasZRotPart;
public Transform ZRotPiece;
public AnimationCurve ZRotCurve;
public Vector2 ZAngles;
public bool ZRotPieceDips;
public float DipMagnitude;
public bool ZRotPieceLags;
public float LagMagnitude;
[Header("Z Scale Part")]
public bool HasZScalePart;
public Transform ZScalePiece;
public AnimationCurve ZScaleCurve;
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_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_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: 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)
((FVRInteractiveObject)this).Awake();
m_boltZ_current = ((Component)this).transform.localPosition.z;
m_boltZ_forward = Point_Bolt_Forward.localPosition.z;
m_boltZ_lock = Point_Bolt_LockPoint.localPosition.z;
m_boltZ_rear = Point_Bolt_Rear.localPosition.z;
if (UsesAKSafetyLock)
{
m_boltZ_safetylock = Point_Bolt_SafetyLock.localPosition.z;
}
}
public float GetBoltLerpBetweenLockAndFore()
{
return Mathf.InverseLerp(m_boltZ_lock, m_boltZ_forward, m_boltZ_current);
}
public float GetBoltLerpBetweenRearAndFore()
{
return Mathf.InverseLerp(m_boltZ_rear, m_boltZ_forward, m_boltZ_current);
}
public void LockBolt()
{
if (!m_isBoltLocked)
{
m_isBoltLocked = true;
}
}
public void ReleaseBolt()
{
if (m_isBoltLocked)
{
if (!((FVRInteractiveObject)this).IsHeld)
{
((FVRFireArm)Weapon).PlayAudioEvent((FirearmAudioEventType)8, 1f);
}
m_isBoltLocked = false;
}
}
public void SnapToRear()
{
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
CurPos = BoltPos.Rear;
m_boltZ_current = m_boltZ_rear;
((Component)this).transform.localPosition = Point_Bolt_Rear.localPosition;
}
public bool IsBoltLocked()
{
return m_isBoltLocked;
}
public override void UpdateInteraction(FVRViveHand hand)
{
//IL_001a: 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_0034: 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_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_0044: 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_0060: 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_0144: 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)
((FVRInteractiveObject)this).UpdateInteraction(hand);
if (HasRotatingPart)
{
Vector3 val = ((Component)this).transform.position - base.m_hand.PalmTransform.position;
Vector3 normalized = ((Vector3)(ref val)).normalized;
if (Vector3.Dot(normalized, ((Component)this).transform.right) > 0f)
{
RotatingPart.localEulerAngles = RotatingPartLeftEulers;
}
else
{
RotatingPart.localEulerAngles = RotatingPartRightEulers;
}
}
if (hand.IsInStreamlinedMode)
{
if (hand.Input.AXButtonDown && HasBoltCatchReleaseButton)
{
m_isBoltCatchHeldOnHandle = true;
((FVRInteractiveObject)this).ForceBreakInteraction();
}
else if (hand.Input.BYButtonDown && HasBoltCatchReleaseButton)
{
m_isReleaseCatchHeldOnHandle = true;
((FVRInteractiveObject)this).ForceBreakInteraction();
}
}
else if (hand.Input.TouchpadDown)
{
if (Vector2.Angle(hand.Input.TouchpadAxes, Vector2.down) < 45f && HasBoltCatchReleaseButton)
{
m_isBoltCatchHeldOnHandle = true;
((FVRInteractiveObject)this).ForceBreakInteraction();
}
else if (Vector2.Angle(hand.Input.TouchpadAxes, Vector2.up) < 45f && HasBoltCatchReleaseButton)
{
m_isReleaseCatchHeldOnHandle = true;
((FVRInteractiveObject)this).ForceBreakInteraction();
}
}
}
public override void EndInteraction(FVRViveHand hand)
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
if (HasRotatingPart)
{
RotatingPart.localEulerAngles = RotatingPartNeutralEulers;
}
if (!m_isBoltLocked)
{
m_curBoltSpeed = Speed_Forward;
}
if (CurPos > BoltPos.Forward)
{
((FVRFireArm)Weapon).PlayAudioEvent((FirearmAudioEventType)8, 1f);
}
if (m_isBoltCatchHeldOnHandle)
{
m_isBoltCatchHeldOnHandle = false;
if (CurPos >= BoltPos.Locked)
{
LockBolt();
}
}
if (m_isReleaseCatchHeldOnHandle)
{
m_isReleaseCatchHeldOnHandle = false;
ReleaseBolt();
}
((FVRInteractiveObject)this).EndInteraction(hand);
}
public void UpdateHandleHeldState(bool state, float lerp)
{
m_isHandleHeld = state;
if (state)
{
m_handleLerp = lerp;
}
}
public void ImpartFiringImpulse()
{
m_curBoltSpeed = Speed_Rearward;
if (CurPos == BoltPos.Forward)
{
m_isBarrelReciprocating = true;
}
}
public bool IsBoltForwardOfSafetyLock()
{
return m_boltZ_current > m_boltZ_safetylock;
}
public void UpdateBolt()
{
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_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_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_0260: Unknown result type (might be due to invalid IL or missing references)
//IL_0265: Unknown result type (might be due to invalid IL or missing references)
//IL_0274: Unknown result type (might be due to invalid IL or missing references)
//IL_0279: Unknown result type (might be due to invalid IL or missing references)
//IL_0288: Unknown result type (might be due to invalid IL or missing references)
//IL_032c: Unknown result type (might be due to invalid IL or missing references)
//IL_02be: Unknown result type (might be due to invalid IL or missing references)
//IL_02c4: Unknown result type (might be due to invalid IL or missing references)
//IL_02cb: Unknown result type (might be due to invalid IL or missing references)
//IL_0461: Unknown result type (might be due to invalid IL or missing references)
//IL_0467: Unknown result type (might be due to invalid IL or missing references)
//IL_046e: Unknown result type (might be due to invalid IL or missing references)
//IL_0441: Unknown result type (might be due to invalid IL or missing references)
//IL_03ff: Unknown result type (might be due to invalid IL or missing references)
//IL_034d: Unknown result type (might be due to invalid IL or missing references)
//IL_0352: Unknown result type (might be due to invalid IL or missing references)
//IL_03bb: Unknown result type (might be due to invalid IL or missing references)
bool flag = false;
if (((FVRInteractiveObject)this).IsHeld || m_isHandleHeld)
{
flag = true;
}
if (((FVRInteractiveObject)this).IsHeld)
{
Vector3 closestValidPoint = ((FVRInteractiveObject)this).GetClosestValidPoint(Point_Bolt_Forward.position, Point_Bolt_Rear.position, ((HandInput)(ref base.m_hand.Input)).Pos);
m_boltZ_heldTarget = ((Component)Weapon).transform.InverseTransformPoint(closestValidPoint).z;
}
else if (m_isHandleHeld)
{
m_boltZ_heldTarget = Mathf.Lerp(m_boltZ_forward, m_boltZ_rear, m_handleLerp);
}
Vector2 val = default(Vector2);
((Vector2)(ref val))..ctor(m_boltZ_rear, m_boltZ_forward);
if (m_boltZ_current <= m_boltZ_lock && m_isBoltLocked)
{
((Vector2)(ref val))..ctor(m_boltZ_rear, m_boltZ_lock);
}
if (UsesAKSafetyLock && Weapon.IsWeaponOnSafe() && m_boltZ_current <= m_boltZ_safetylock)
{
((Vector2)(ref val))..ctor(m_boltZ_safetylock, m_boltZ_forward);
}
if (DoesClipHoldBoltOpen && (Object)(object)((FVRFireArm)Weapon).Clip != (Object)null)
{
((Vector2)(ref val))..ctor(m_boltZ_rear, m_boltZ_lock);
}
if (flag)
{
m_curBoltSpeed = 0f;
}
else if ((CurPos < BoltPos.LockedToRear && m_curBoltSpeed >= 0f) || LastPos >= BoltPos.Rear)
{
m_curBoltSpeed = Mathf.MoveTowards(m_curBoltSpeed, Speed_Forward, Time.deltaTime * SpringStiffness);
}
float boltZ_current = m_boltZ_current;
float boltZ_current2 = m_boltZ_current;
if (flag)
{
boltZ_current2 = m_boltZ_heldTarget;
boltZ_current = Mathf.MoveTowards(m_boltZ_current, boltZ_current2, Speed_Held * Time.deltaTime);
}
else
{
boltZ_current = m_boltZ_current + m_curBoltSpeed * Time.deltaTime;
}
boltZ_current = Mathf.Clamp(boltZ_current, val.x, val.y);
if (Mathf.Abs(boltZ_current - m_boltZ_current) > Mathf.Epsilon)
{
m_boltZ_current = boltZ_current;
((Component)this).transform.localPosition = new Vector3(((Component)this).transform.localPosition.x, ((Component)this).transform.localPosition.y, m_boltZ_current);
if (HasReciprocatingBarrel && m_isBarrelReciprocating)
{
float num = 1f - GetBoltLerpBetweenLockAndFore();
Barrel.localPosition = Vector3.Lerp(BarrelForward, BarrelRearward, num);
}
if (HasZRotPart)
{
float num2 = 1f - GetBoltLerpBetweenLockAndFore();
float num3 = ZRotCurve.Evaluate(num2);
ZRotPiece.localEulerAngles = new Vector3(0f, 0f, Mathf.Lerp(ZAngles.x, ZAngles.y, num3));
if (ZRotPieceDips || ZRotPieceLags)
{
Vector3 zero = Vector3.zero;
if (ZRotPieceDips)
{
zero.y = Mathf.Lerp(0f, 0f - DipMagnitude, num2);
}
if (ZRotPieceLags)
{
float num4 = Mathf.Abs(m_boltZ_forward - m_boltZ_current);
zero.z = Mathf.Clamp(num4, 0f, LagMagnitude);
}
ZRotPiece.localPosition = zero;
}
}
if (HasZScalePart)
{
float num5 = 1f - GetBoltLerpBetweenLockAndFore();
float num6 = ZScaleCurve.Evaluate(num5);
ZScalePiece.localScale = new Vector3(1f, 1f, num6);
}
}
else
{
m_curBoltSpeed = 0f;
}
if (HasHammer)
{
if (Weapon.IsHammerCocked)
{
Hammer.localEulerAngles = HammerRearward;
}
else
{
float boltLerpBetweenLockAndFore = GetBoltLerpBetweenLockAndFore();
Hammer.localEulerAngles = Vector3.Lerp(HammerRearward, HammerForward, boltLerpBetweenLockAndFore);
}
}
BoltPos curPos = CurPos;
curPos = ((!(Mathf.Abs(m_boltZ_current - m_boltZ_forward) < 0.001f)) ? ((Mathf.Abs(m_boltZ_current - m_boltZ_lock) < 0.001f) ? BoltPos.Locked : ((Mathf.Abs(m_boltZ_current - m_boltZ_rear) < 0.001f) ? BoltPos.Rear : ((m_boltZ_current > m_boltZ_lock) ? BoltPos.ForwardToMid : BoltPos.LockedToRear))) : BoltPos.Forward);
int curPos2 = (int)CurPos;
CurPos = curPos;
if (CurPos >= BoltPos.ForwardToMid)
{
((FVRFireArm)Weapon).IsBreachOpenForGasOut = true;
}
else
{
((FVRFireArm)Weapon).IsBreachOpenForGasOut = false;
}
if (CurPos == BoltPos.Rear && LastPos != BoltPos.Rear)
{
BoltEvent_SmackRear();
}
if (CurPos == BoltPos.Locked && LastPos != BoltPos.Locked)
{
BoltEvent_BoltCaught();
}
if (CurPos >= BoltPos.Locked && LastPos < BoltPos.Locked)
{
BoltEvent_EjectRound();
}
if (CurPos < BoltPos.Locked && LastPos > BoltPos.ForwardToMid)
{
BoltEvent_ExtractRoundFromMag();
}
if (CurPos == BoltPos.Forward && LastPos != 0)
{
BoltEvent_ArriveAtFore();
}
if (CurPos >= BoltPos.Locked && ((HasLastRoundBoltHoldOpen && (Object)(object)((FVRFireArm)Weapon).Magazine != (Object)null && !((FVRFireArm)Weapon).Magazine.HasARound() && !Weapon.Chamber.IsFull) || Weapon.IsBoltCatchButtonHeld))
{
LockBolt();
}
LastPos = CurPos;
}
private void BoltEvent_ArriveAtFore()
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
Weapon.ChamberRound();
if (HasReciprocatingBarrel && m_isBarrelReciprocating)
{
m_isBarrelReciprocating = false;
Barrel.localPosition = BarrelForward;
}
if (((FVRInteractiveObject)this).IsHeld)
{
((FVRFireArm)Weapon).PlayAudioEvent((FirearmAudioEventType)2, 1f);
}
else
{
((FVRFireArm)Weapon).PlayAudioEvent((FirearmAudioEventType)0, 1f);
}
}
private void BoltEvent_EjectRound()
{
Weapon.EjectExtractedRound();
bool playPrefireSound = false;
if (((FVRInteractiveObject)this).IsHeld || m_isHandleHeld)
{
playPrefireSound = true;
}
Weapon.CockHammer(playPrefireSound);
}
private void BoltEvent_ExtractRoundFromMag()
{
Weapon.BeginChamberingRound();
}
private void BoltEvent_BoltCaught()
{
if (m_isBoltLocked)
{
((FVRFireArm)Weapon).PlayAudioEvent((FirearmAudioEventType)4, 1f);
}
}
private void BoltEvent_SmackRear()
{
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_0119: Invalid comparison between Unknown and I4
if ((((FVRInteractiveObject)this).IsHeld || m_isHandleHeld) && (!Weapon.BoltLocksWhenNoMagazineFound || (Object)(object)((FVRFireArm)Weapon).Magazine != (Object)null))
{
ReleaseBolt();
}
if (Weapon.EjectsMagazineOnEmpty && (Object)(object)((FVRFireArm)Weapon).Magazine != (Object)null && !((FVRFireArm)Weapon).Magazine.HasARound())
{
((FVRFireArm)Weapon).EjectMag(false);
}
if (Weapon.BoltLocksWhenNoMagazineFound && (Object)(object)((FVRFireArm)Weapon).Magazine == (Object)null)
{
LockBolt();
}
if (((FVRInteractiveObject)this).IsHeld || ((((Object)(object)Weapon.Handle != (Object)null && ((FVRInteractiveObject)Weapon.Handle).IsHeld) || ((Object)(object)Weapon.ForeHandle != (Object)null && (int)Weapon.ForeHandle.Mode == 1 && ((FVRInteractiveObject)Weapon.ForeHandle).IsHeld)) && ((FVRFireArm)Weapon).AudioClipSet.BoltSlideBackHeld.Clips.Count > 0))
{
((FVRFireArm)Weapon).PlayAudioEvent((FirearmAudioEventType)3, 1f);
}
else
{
((FVRFireArm)Weapon).PlayAudioEvent((FirearmAudioEventType)1, 1f);
}
}
}
public class DoubleBarreledClosedBoltWeapon : FVRFireArm
{
public enum FireSelectorModeType
{
Safe,
Single,
Burst,
FullAuto,
SuperFastBurst
}
public class FireSelectorMode
{
public float SelectorPosition;
public FireSelectorModeType ModeType;
public int BurstAmount = 3;
public bool ARStyleBurst;
public float EngagementDelay;
}
[Header("ClosedBoltWeapon Config")]
public bool HasFireSelectorButton = true;
public bool HasMagReleaseButton = true;
public bool HasBoltReleaseButton = true;
public bool HasBoltCatchButton = true;
public bool HasHandle = true;
public bool HasForeHandle;
public bool HasWrap;
[Header("Component Connections")]
public DoubleBarrelClosedBoltWeaponBolt Bolt;
public ClosedBoltHandle Handle;
public ClosedBoltForeHandle ForeHandle;
public ClosedBoltCarrierWrap CarrierWrap;
public FVRFireArmChamber Chamber;
public Transform Trigger;
public Transform FireSelectorSwitch;
public Transform FireSelectorSwitch2;
[Header("Round Positions")]
public Transform RoundPos_Ejecting;
public Transform RoundPos_Ejection;
public Transform RoundPos_MagazinePos;
private FVRFirearmMovingProxyRound m_proxy;
public Vector3 EjectionSpeed = new Vector3(4f, 2.5f, -1.2f);
public Vector3 EjectionSpin = new Vector3(20f, 180f, 30f);
public bool UsesDelinker;
public ParticleSystem DelinkerSystem;
[Header("Trigger Config")]
public bool HasTrigger;
public float TriggerFiringThreshold = 0.8f;
public float TriggerResetThreshold = 0.4f;
public float TriggerDualStageThreshold = 0.95f;
public float Trigger_ForwardValue;
public float Trigger_RearwardValue;
public Axis TriggerAxis;
public InterpStyle TriggerInterpStyle = (InterpStyle)1;
public bool UsesDualStageFullAuto;
private float m_triggerFloat;
private bool m_hasTriggerReset;
private int m_CamBurst;
private bool m_isHammerCocked;
private float m_engagementDelay;
private int m_fireSelectorMode;
[Header("Fire Selector Config")]
public InterpStyle FireSelector_InterpStyle = (InterpStyle)1;
public Axis FireSelector_Axis;
public FireSelectorMode[] FireSelector_Modes;
[Header("Secondary Fire Selector Config")]
public InterpStyle FireSelector_InterpStyle2 = (InterpStyle)1;
public Axis FireSelector_Axis2;
public FireSelectorMode[] FireSelector_Modes2;
[Header("Magazine Release Button")]
public Transform MagazineReleaseButton;
public InterpStyle MagReleaseInterp;
public Vector3 MagReleaseUnpressed;
public Vector3 MagReleasePressed;
private bool WasMagReleaseHeldDown;
[Header("Bolt Release Button")]
public bool HasBoltReleaseVisual;
public Transform BoltCatch;
public InterpStyle BoltCatchInterp;
public Vector3 BoltCatch_Caught;
public Vector3 BoltCatch_Released;
private bool wasBoltCaught;
[Header("SpecialFeatures")]
public bool EjectsMagazineOnEmpty;
public bool BoltLocksWhenNoMagazineFound;
public bool BoltDropsWhenMagazineInserted;
public bool BoltDropsWhenEmptyMagazineEjected;
public bool DoesClipEntryRequireBoltBack = true;
public bool UsesMagMountTransformOverride;
public Transform MagMountTransformOverride;
public bool ReciprocatesOnShot = true;
[Header("StickySystem")]
public bool UsesStickyDetonation;
public AudioEvent StickyDetonateSound;
public Transform StickyTrigger;
public Vector2 StickyRotRange = new Vector2(0f, 20f);
private float m_stickyChargeUp;
public float StickyChargeUpSpeed = 1f;
public AudioSource m_chargeSound;
public Renderer StickyScreen;
public float StickyMaxMultBonus = 1.3f;
public float StickyForceMult = 1f;
[HideInInspector]
public bool IsMagReleaseButtonHeld;
[HideInInspector]
public bool IsBoltReleaseButtonHeld;
[HideInInspector]
public bool IsBoltCatchButtonHeld;
private float m_timeSinceFiredShot = 1f;
private bool m_hasStickTriggerDown;
private List<MF2_StickyBomb> m_primedBombs = new List<MF2_StickyBomb>();
[Header("Double Barrel Config")]
public FVRFireArmChamber Chamber2;
public Transform SecondMuzzle;
[Header("Round 2 Positions")]
public Transform RoundPos_Ejecting2;
public Transform RoundPos_Ejection2;
public Transform RoundPos_MagazinePos2;
private FVRFirearmMovingProxyRound m_proxy2;
public Vector3 EjectionSpeed2 = new Vector3(4f, 2.5f, -1.2f);
public Vector3 EjectionSpin2 = new Vector3(20f, 180f, 30f);
public bool IsHammerCocked => m_isHammerCocked;
public int FireSelectorModeIndex => m_fireSelectorMode;
public void NukeShadows()
{
m_proxy.NukeShadowCasting();
((Renderer)Chamber.ProxyRenderer).shadowCastingMode = (ShadowCastingMode)0;
m_proxy2.NukeShadowCasting();
((Renderer)Chamber2.ProxyRenderer).shadowCastingMode = (ShadowCastingMode)0;
}
public bool HasExtractedRound()
{
return m_proxy.IsFull;
}
public override void Awake()
{
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Expected O, but got Unknown
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Expected O, but got Unknown
((FVRFireArm)this).Awake();
base.FChambers.Add(Chamber);
base.FChambers.Add(Chamber2);
m_CamBurst = 0;
ResetCamBurst();
GameObject val = new GameObject("m_proxyRound");
m_proxy = val.AddComponent<FVRFirearmMovingProxyRound>();
m_proxy.Init(((Component)this).transform);
GameObject val2 = new GameObject("m_proxyRound2");
m_proxy2 = val2.AddComponent<FVRFirearmMovingProxyRound>();
m_proxy2.Init(((Component)this).transform);
}
public void SecondaryFireSelectorClicked()
{
((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)15, 1f);
}
public void CockHammer(bool playPrefireSound = false)
{
if (!m_isHammerCocked)
{
m_isHammerCocked = true;
if (playPrefireSound)
{
((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)7, 1f);
}
}
}
public void DropHammer()
{
if (m_isHammerCocked)
{
m_isHammerCocked = false;
((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)6, 1f);
Fire();
}
}
public bool IsWeaponOnSafe()
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Invalid comparison between Unknown and I4
return FireSelector_Modes.Length != 0 && (int)FireSelector_Modes[m_fireSelectorMode].ModeType == 0;
}
public void ResetCamBurst()
{
FireSelectorMode val = FireSelector_Modes[m_fireSelectorMode];
m_CamBurst = val.BurstAmount;
m_engagementDelay = 0f;
}
protected virtual void ToggleFireSelector()
{
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: 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_014f: Unknown result type (might be due to invalid IL or missing references)
if (FireSelector_Modes.Length > 1)
{
if (Bolt.UsesAKSafetyLock && !Bolt.IsBoltForwardOfSafetyLock())
{
int num = m_fireSelectorMode + 1;
if (num >= FireSelector_Modes.Length)
{
num -= FireSelector_Modes.Length;
}
if ((int)FireSelector_Modes[num].ModeType == 0)
{
return;
}
}
m_fireSelectorMode++;
if (m_fireSelectorMode >= FireSelector_Modes.Length)
{
m_fireSelectorMode -= FireSelector_Modes.Length;
}
FireSelectorMode val = FireSelector_Modes[m_fireSelectorMode];
if (m_triggerFloat < 0.1f)
{
m_CamBurst = val.BurstAmount;
m_engagementDelay = 0f;
}
((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)15, 1f);
if ((Object)(object)FireSelectorSwitch != (Object)null)
{
((FVRPhysicalObject)this).SetAnimatedComponent(FireSelectorSwitch, val.SelectorPosition, FireSelector_InterpStyle, FireSelector_Axis);
}
if ((Object)(object)FireSelectorSwitch2 != (Object)null)
{
FireSelectorMode val2 = FireSelector_Modes2[m_fireSelectorMode];
((FVRPhysicalObject)this).SetAnimatedComponent(FireSelectorSwitch2, val2.SelectorPosition, FireSelector_InterpStyle2, FireSelector_Axis2);
}
if (HasWrap)
{
CarrierWrap.OnFireModeChanged();
}
}
ResetCamBurst();
}
public void EjectExtractedRound()
{
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: 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_0044: 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_0059: 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_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_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
//IL_00df: 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_0114: 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_012f: Unknown result type (might be due to invalid IL or missing references)
//IL_013a: Unknown result type (might be due to invalid IL or missing references)
//IL_014a: 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_015a: Unknown result type (might be due to invalid IL or missing references)
//IL_016a: Unknown result type (might be due to invalid IL or missing references)
//IL_016f: Unknown result type (might be due to invalid IL or missing references)
//IL_017a: Unknown result type (might be due to invalid IL or missing references)
//IL_018a: 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_01a5: Unknown result type (might be due to invalid IL or missing references)
//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
if (Chamber.IsFull)
{
Chamber.EjectRound(RoundPos_Ejection.position, ((Component)this).transform.right * EjectionSpeed.x + ((Component)this).transform.up * EjectionSpeed.y + ((Component)this).transform.forward * EjectionSpeed.z, ((Component)this).transform.right * EjectionSpin.x + ((Component)this).transform.up * EjectionSpin.y + ((Component)this).transform.forward * EjectionSpin.z, RoundPos_Ejection.position, RoundPos_Ejection.rotation, false);
}
if (Chamber2.IsFull)
{
Chamber2.EjectRound(RoundPos_Ejection2.position, ((Component)this).transform.right * EjectionSpeed2.x + ((Component)this).transform.up * EjectionSpeed2.y + ((Component)this).transform.forward * EjectionSpeed2.z, ((Component)this).transform.right * EjectionSpin2.x + ((Component)this).transform.up * EjectionSpin2.y + ((Component)this).transform.forward * EjectionSpin2.z, RoundPos_Ejection2.position, RoundPos_Ejection2.rotation, false);
}
}
public void BeginChamberingRound()
{
bool flag = false;
GameObject fromPrefabReference = null;
bool flag2 = false;
GameObject fromPrefabReference2 = null;
if (base.HasBelt && !m_proxy.IsFull && base.BeltDD.HasARound())
{
flag = true;
fromPrefabReference = base.BeltDD.RemoveRound(false);
}
if (!m_proxy.IsFull && (Object)(object)base.Magazine != (Object)null && !base.Magazine.IsBeltBox && base.Magazine.HasARound())
{
flag = true;
fromPrefabReference = base.Magazine.RemoveRound(false);
}
if (flag)
{
if (flag)
{
m_proxy.SetFromPrefabReference(fromPrefabReference);
}
if (!m_proxy2.IsFull && (Object)(object)base.Magazine != (Object)null && !base.Magazine.IsBeltBox && base.Magazine.HasARound())
{
flag2 = true;
fromPrefabReference2 = base.Magazine.RemoveRound(false);
}
if (flag2 && flag2)
{
m_proxy2.SetFromPrefabReference(fromPrefabReference2);
}
}
}
public bool ChamberRound()
{
if (m_proxy.IsFull && !Chamber.IsFull)
{
Chamber.SetRound(m_proxy.Round, false);
m_proxy.ClearProxy();
}
if (m_proxy2.IsFull && !Chamber2.IsFull)
{
Chamber2.SetRound(m_proxy2.Round, false);
m_proxy2.ClearProxy();
return true;
}
return false;
}
public override Transform GetMagMountingTransform()
{
if (UsesMagMountTransformOverride)
{
return MagMountTransformOverride;
}
return ((FVRFireArm)this).GetMagMountingTransform();
}
public override void FVRFixedUpdate()
{
//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_0039: 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_0054: 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_0074: 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_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
((FVRFireArm)this).FVRFixedUpdate();
if (UsesStickyDetonation && m_stickyChargeUp > 0f)
{
Rigidbody rootRigidbody = ((FVRPhysicalObject)this).RootRigidbody;
rootRigidbody.velocity += Random.onUnitSphere * 0.2f * m_stickyChargeUp * StickyForceMult;
Rigidbody rootRigidbody2 = ((FVRPhysicalObject)this).RootRigidbody;
rootRigidbody2.angularVelocity += Random.onUnitSphere * 1f * m_stickyChargeUp * StickyForceMult;
}
}
public bool Fire()
{
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
//IL_00de: Invalid comparison between Unknown and I4
//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
//IL_021c: Unknown result type (might be due to invalid IL or missing references)
if (!Chamber.Fire())
{
return false;
}
m_timeSinceFiredShot = 0f;
float num = 1f;
if (UsesStickyDetonation)
{
num = 1f + Mathf.Lerp(0f, StickyMaxMultBonus, m_stickyChargeUp);
}
((FVRFireArm)this).Fire(Chamber, ((FVRFireArm)this).GetMuzzle(), true, num, -1f);
if (Chamber2.Fire())
{
((FVRFireArm)this).Fire(Chamber2, SecondMuzzle, false, num, -1f);
}
bool flag = ((FVRFireArm)this).IsTwoHandStabilized();
bool flag2 = (Object)(object)((FVRPhysicalObject)this).AltGrip != (Object)null;
bool flag3 = ((FVRFireArm)this).IsShoulderStabilized();
((FVRFireArm)this).Recoil(flag, flag2, flag3, (FVRFireArmRecoilProfile)null, 1f);
bool flag4 = false;
FireSelectorMode val = FireSelector_Modes[m_fireSelectorMode];
if ((int)val.ModeType == 4)
{
for (int i = 0; i < val.BurstAmount - 1; i++)
{
if (base.Magazine.HasARound())
{
base.Magazine.RemoveRound();
((FVRFireArm)this).Fire(Chamber, ((FVRFireArm)this).GetMuzzle(), false, 1f, -1f);
flag4 = true;
((FVRFireArm)this).Recoil(flag, flag2, flag3, (FVRFireArmRecoilProfile)null, 1f);
}
}
}
((FVRFireArm)this).FireMuzzleSmoke();
if (UsesDelinker && base.HasBelt)
{
DelinkerSystem.Emit(1);
}
if (base.HasBelt)
{
base.BeltDD.PopEjectFlaps();
base.BeltDD.AddJitter();
}
if (flag4)
{
((FVRFireArm)this).PlayAudioGunShot(false, Chamber.GetRound().TailClass, Chamber.GetRound().TailClassSuppressed, GM.CurrentPlayerBody.GetCurrentSoundEnvironment());
}
else
{
((FVRFireArm)this).PlayAudioGunShot(Chamber.GetRound(), GM.CurrentPlayerBody.GetCurrentSoundEnvironment(), 1f);
}
if (ReciprocatesOnShot && (!HasForeHandle || (int)ForeHandle.Mode == 0))
{
Bolt.ImpartFiringImpulse();
}
return true;
}
public override void FVRUpdate()
{
((FVRFireArm)this).FVRUpdate();
UpdateComponents();
if (m_engagementDelay > 0f)
{
m_engagementDelay -= Time.deltaTime;
}
if (HasHandle)
{
Handle.UpdateHandle();
Bolt.UpdateHandleHeldState(Handle.ShouldControlBolt(), 1f - Handle.GetBoltLerpBetweenLockAndFore());
}
if (HasWrap)
{
CarrierWrap.UpdateWrap();
}
Bolt.UpdateBolt();
if (base.UsesClips && DoesClipEntryRequireBoltBack)
{
if (Bolt.CurPos >= DoubleBarrelClosedBoltWeaponBolt.BoltPos.Locked)
{
if (!base.ClipTrigger.activeSelf)
{
base.ClipTrigger.SetActive(true);
}
}
else if (base.ClipTrigger.activeSelf)
{
base.ClipTrigger.SetActive(false);
}
}
UpdateDisplayRoundPositions();
if (m_timeSinceFiredShot < 1f)
{
m_timeSinceFiredShot += Time.deltaTime;
}
}
public override void LoadMag(FVRFireArmMagazine mag)
{
((FVRFireArm)this).LoadMag(mag);
if ((BoltLocksWhenNoMagazineFound || (BoltDropsWhenMagazineInserted && mag.HasARound())) && (Object)(object)mag != (Object)null && Bolt.IsBoltLocked())
{
Bolt.ReleaseBolt();
}
}
public override void EjectMag(bool PhysicalRelease = false)
{
bool flag = false;
if ((Object)(object)base.Magazine != (Object)null && !base.Magazine.HasARound())
{
flag = true;
}
((FVRFireArm)this).EjectMag(PhysicalRelease);
if (Bolt.IsBoltLocked() && flag && BoltDropsWhenEmptyMagazineEjected)
{
Bolt.ReleaseBolt();
}
}
public override void UpdateInteraction(FVRViveHand hand)
{
((FVRPhysicalObject)this).UpdateInteraction(hand);
UpdateInputAndAnimate(hand);
}
private void UpdateInputAndAnimate(FVRViveHand hand)
{
//IL_0292: Unknown result type (might be due to invalid IL or missing references)
//IL_0297: Unknown result type (might be due to invalid IL or missing references)
//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
//IL_02cf: Unknown result type (might be due to invalid IL or missing references)
//IL_04ac: Unknown result type (might be due to invalid IL or missing references)
//IL_04b1: Unknown result type (might be due to invalid IL or missing references)
//IL_04b2: Unknown result type (might be due to invalid IL or missing references)
//IL_0414: Unknown result type (might be due to invalid IL or missing references)
//IL_0415: Unknown result type (might be due to invalid IL or missing references)
//IL_02f0: Unknown result type (might be due to invalid IL or missing references)
//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
//IL_0444: Unknown result type (might be due to invalid IL or missing references)
//IL_0445: Unknown result type (might be due to invalid IL or missing references)
//IL_0324: Unknown result type (might be due to invalid IL or missing references)
//IL_0325: Unknown result type (might be due to invalid IL or missing references)
//IL_0474: Unknown result type (might be due to invalid IL or missing references)
//IL_0475: Unknown result type (might be due to invalid IL or missing references)
//IL_062d: Unknown result type (might be due to invalid IL or missing references)
//IL_062f: Invalid comparison between Unknown and I4
//IL_063f: Unknown result type (might be due to invalid IL or missing references)
//IL_0641: Invalid comparison between Unknown and I4
//IL_0662: Unknown result type (might be due to invalid IL or missing references)
//IL_0664: Invalid comparison between Unknown and I4
IsBoltReleaseButtonHeld = false;
IsBoltCatchButtonHeld = false;
IsMagReleaseButtonHeld = false;
if (((FVRPhysicalObject)this).IsAltHeld)
{
return;
}
if (((FVRInteractiveObject)this).m_hasTriggeredUpSinceBegin && m_engagementDelay <= 0f)
{
m_triggerFloat = hand.Input.TriggerFloat;
}
else
{
m_triggerFloat = 0f;
}
if (!m_hasTriggerReset && m_triggerFloat <= TriggerResetThreshold)
{
m_hasTriggerReset = true;
if (FireSelector_Modes.Length > 0)
{
if (FireSelector_Modes[m_fireSelectorMode].ARStyleBurst && m_CamBurst <= 0)
{
m_CamBurst = FireSelector_Modes[m_fireSelectorMode].BurstAmount;
}
else if (!FireSelector_Modes[m_fireSelectorMode].ARStyleBurst)
{
m_CamBurst = FireSelector_Modes[m_fireSelectorMode].BurstAmount;
}
m_engagementDelay = FireSelector_Modes[m_fireSelectorMode].EngagementDelay;
}
((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)16, 1f);
}
if (hand.IsInStreamlinedMode)
{
if (hand.Input.BYButtonDown)
{
if (Bolt.IsBoltLocked() && HasBoltReleaseButton)
{
Bolt.ReleaseBolt();
}
else
{
ToggleFireSelector();
}
if (UsesStickyDetonation)
{
Detonate();
}
}
if (hand.Input.AXButtonDown && HasMagReleaseButton && (!EjectsMagazineOnEmpty || (Bolt.CurPos >= DoubleBarrelClosedBoltWeaponBolt.BoltPos.Locked && ((FVRInteractiveObject)Bolt).IsHeld && !m_proxy.IsFull)))
{
ReleaseMag();
}
if (hand.Input.AXButtonPressed && HasMagReleaseButton)
{
IsMagReleaseButtonHeld = true;
}
if (UsesStickyDetonation)
{
if (hand.Input.BYButtonDown)
{
((FVRPhysicalObject)this).SetAnimatedComponent(StickyTrigger, StickyRotRange.y, (InterpStyle)1, (Axis)0);
}
else if (hand.Input.BYButtonUp)
{
((FVRPhysicalObject)this).SetAnimatedComponent(StickyTrigger, StickyRotRange.x, (InterpStyle)1, (Axis)0);
}
}
}
else
{
Vector2 touchpadAxes = hand.Input.TouchpadAxes;
if (hand.Input.TouchpadDown)
{
if (UsesStickyDetonation)
{
Detonate();
}
if (((Vector2)(ref touchpadAxes)).magnitude > 0.2f)
{
if (Vector2.Angle(touchpadAxes, Vector2.left) <= 45f)
{
ToggleFireSelector();
}
else if (Vector2.Angle(touchpadAxes, Vector2.up) <= 45f)
{
if (HasBoltReleaseButton)
{
Bolt.ReleaseBolt();
}
}
else if (Vector2.Angle(touchpadAxes, Vector2.down) <= 45f && HasMagReleaseButton && (!EjectsMagazineOnEmpty || (Bolt.CurPos >= DoubleBarrelClosedBoltWeaponBolt.BoltPos.Locked && ((FVRInteractiveObject)Bolt).IsHeld && !m_proxy.IsFull)))
{
ReleaseMag();
}
}
}
if (UsesStickyDetonation)
{
if (hand.Input.TouchpadDown)
{
((FVRPhysicalObject)this).SetAnimatedComponent(StickyTrigger, StickyRotRange.y, (InterpStyle)1, (Axis)0);
}
else if (hand.Input.TouchpadUp)
{
((FVRPhysicalObject)this).SetAnimatedComponent(StickyTrigger, StickyRotRange.x, (InterpStyle)1, (Axis)0);
}
}
if (hand.Input.TouchpadPressed && ((Vector2)(ref touchpadAxes)).magnitude > 0.2f)
{
if (Vector2.Angle(touchpadAxes, Vector2.up) <= 45f)
{
if (HasBoltReleaseButton)
{
IsBoltReleaseButtonHeld = true;
}
}
else if (Vector2.Angle(touchpadAxes, Vector2.right) <= 45f)
{
if (HasBoltCatchButton)
{
IsBoltCatchButtonHeld = true;
}
}
else if (Vector2.Angle(touchpadAxes, Vector2.down) <= 45f && HasMagReleaseButton)
{
IsMagReleaseButtonHeld = true;
}
}
}
FireSelectorModeType modeType = FireSelector_Modes[m_fireSelectorMode].ModeType;
if ((int)modeType == 0 || !((FVRInteractiveObject)this).m_hasTriggeredUpSinceBegin)
{
return;
}
if (UsesStickyDetonation)
{
if (Bolt.CurPos != 0 || !Chamber.IsFull || Chamber.IsSpent)
{
return;
}
if (hand.Input.TriggerPressed && m_hasTriggerReset)
{
m_hasStickTriggerDown = true;
m_stickyChargeUp += Time.deltaTime * 0.25f * StickyChargeUpSpeed;
m_stickyChargeUp = Mathf.Clamp(m_stickyChargeUp, 0f, 1f);
if (m_stickyChargeUp > 0.05f && !m_chargeSound.isPlaying)
{
m_chargeSound.Play();
}
}
else
{
if (m_chargeSound.isPlaying)
{
m_chargeSound.Stop();
}
m_stickyChargeUp = 0f;
}
if (m_hasStickTriggerDown && (hand.Input.TriggerUp || m_stick