using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using FistVR;
using HarmonyLib;
using OtherLoader;
using ShermanJumbo;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
public class AT4 : SimpleLauncher
{
[Header("Trigger Settings")]
public Transform Trigger;
public Axis Trigger_Axis = (Axis)0;
public Vector2 Trigger_ValRange = new Vector2(0f, 10f);
private float m_triggerVal;
[Header("Rocket Settings")]
[HideInInspector]
public bool hasFired = false;
[Header("Self-Destruct")]
public float DestroyDelay = 10f;
private bool selfDestructStarted = false;
public AT4ArmingLever ArmingLever;
private void FireAT4()
{
if (base.Chamber.IsFull && !base.Chamber.IsSpent && !((Object)(object)ArmingLever == (Object)null) && ArmingLever.IsArmed)
{
base.Chamber.Fire();
((FVRFireArm)this).FireMuzzleSmoke();
hasFired = true;
StartSelfDestructCheck();
}
}
public override void UpdateInteraction(FVRViveHand hand)
{
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Expected I4, but got Unknown
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: Expected I4, but got Unknown
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)ArmingLever != (Object)null && !ArmingLever.IsArmed)
{
if ((Object)(object)Trigger != (Object)null && (Object)(object)hand != (Object)null)
{
Vector3 localPosition = Trigger.localPosition;
((Vector3)(ref localPosition))[(int)Trigger_Axis] = Mathf.Lerp(Trigger_ValRange.x, Trigger_ValRange.y, hand.Input.TriggerFloat);
Trigger.localPosition = localPosition;
}
return;
}
((SimpleLauncher)this).UpdateInteraction(hand);
if ((Object)(object)Trigger != (Object)null && (Object)(object)hand != (Object)null)
{
Vector3 localPosition2 = Trigger.localPosition;
((Vector3)(ref localPosition2))[(int)Trigger_Axis] = Mathf.Lerp(Trigger_ValRange.x, Trigger_ValRange.y, hand.Input.TriggerFloat);
Trigger.localPosition = localPosition2;
}
if ((Object)(object)ArmingLever != (Object)null && ArmingLever.IsArmed && !((FVRPhysicalObject)this).IsAltHeld && (Object)(object)hand != (Object)null && hand.Input.TriggerDown && !hasFired && base.Chamber.IsFull && !base.Chamber.IsSpent)
{
FireAT4();
}
if ((!base.Chamber.IsFull || hasFired) && !selfDestructStarted && !((FVRInteractiveObject)this).IsHeld)
{
StartSelfDestructCheck();
}
}
private void StartSelfDestructCheck()
{
if (!selfDestructStarted)
{
selfDestructStarted = true;
((MonoBehaviour)this).StartCoroutine(SelfDestructCheck());
}
}
private IEnumerator SelfDestructCheck()
{
float timer = 0f;
while (timer < DestroyDelay)
{
if (!((FVRInteractiveObject)this).IsHeld)
{
timer += Time.deltaTime;
}
yield return null;
}
Object.Destroy((Object)(object)((Component)this).gameObject);
}
}
public class AT4ArmingLever : FVRInteractiveObject
{
public AT4 Weapon;
[Header("Lever Movement")]
public Transform LeverRoot;
public Transform ForwardPoint;
public Transform RearPoint;
[Header("Arming Settings")]
public float ArmThreshold = 0.9f;
[Header("Lever Rotation Settings")]
[Tooltip("Which local axis to rotate around: 0=X, 1=Y, 2=Z")]
public int RotationAxis = 1;
[Tooltip("Starting rotation (degrees) for the selected axis.")]
public float StartRotation = 0f;
[Tooltip("Ending rotation (degrees) for the selected axis.")]
public float EndRotation = 45f;
[Tooltip("How far right (in local X units) the hand must move for full rotation.")]
public float MaxRightOffset = 0.1f;
private bool isArmed = false;
private float leverProgress = 0f;
private Vector3 startLocalPos;
private Vector3 endLocalPos;
public bool IsArmed => isArmed;
public override void Awake()
{
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).Awake();
if ((Object)(object)LeverRoot != (Object)null && (Object)(object)ForwardPoint != (Object)null && (Object)(object)RearPoint != (Object)null)
{
startLocalPos = RearPoint.localPosition;
endLocalPos = ForwardPoint.localPosition;
}
}
public override void UpdateInteraction(FVRViveHand hand)
{
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_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_006a: 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_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: 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_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)
//IL_00cc: 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_00e8: Unknown result type (might be due to invalid IL or missing references)
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).UpdateInteraction(hand);
if ((Object)(object)LeverRoot == (Object)null || (Object)(object)ForwardPoint == (Object)null || (Object)(object)RearPoint == (Object)null || (Object)(object)Weapon == (Object)null)
{
return;
}
Vector3 position = RearPoint.position;
Vector3 position2 = ForwardPoint.position;
Vector3 closestValidPoint = ((FVRInteractiveObject)this).GetClosestValidPoint(position, position2, ((HandInput)(ref hand.Input)).Pos);
float num = Vector3.Distance(position, closestValidPoint) / Vector3.Distance(position, position2);
num = Mathf.Clamp01(num);
if (num < 1f)
{
LeverRoot.position = closestValidPoint;
leverProgress = num;
SetLeverRotation(StartRotation);
}
else
{
LeverRoot.position = position2;
float num2 = Mathf.Clamp(ForwardPoint.InverseTransformPoint(((HandInput)(ref hand.Input)).Pos).x, 0f - MaxRightOffset, MaxRightOffset);
float num3 = ((!(MaxRightOffset > 0f)) ? 0f : ((num2 + MaxRightOffset) / (2f * MaxRightOffset)));
float leverRotation = Mathf.Lerp(StartRotation, EndRotation, num3);
SetLeverRotation(leverRotation);
leverProgress = 1f;
}
if (!isArmed && leverProgress >= ArmThreshold)
{
isArmed = true;
if ((Object)(object)Weapon != (Object)null)
{
((FVRFireArm)Weapon).PlayAudioEvent((FirearmAudioEventType)12, 1f);
}
}
else if (isArmed && leverProgress < 0.2f)
{
isArmed = false;
}
}
private void SetLeverRotation(float angle)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: 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_0047: Unknown result type (might be due to invalid IL or missing references)
Vector3 zero = Vector3.zero;
if (RotationAxis == 0)
{
zero.x = angle;
}
else if (RotationAxis == 1)
{
zero.y = angle;
}
else
{
zero.z = angle;
}
LeverRoot.localRotation = Quaternion.Euler(zero);
}
public override void EndInteraction(FVRViveHand hand)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: 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_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).EndInteraction(hand);
Vector3 position = RearPoint.position;
Vector3 position2 = ForwardPoint.position;
float num = Vector3.Distance(LeverRoot.position, position);
float num2 = Vector3.Distance(LeverRoot.position, position2);
if (num2 < num)
{
LeverRoot.position = position2;
SetLeverRotation(EndRotation);
}
else
{
LeverRoot.position = position;
SetLeverRotation(StartRotation);
}
}
}
public class AT4SightCover : FVRInteractiveObject
{
[Header("Sight References")]
public Transform Sight;
public Transform Cover;
public Transform CoverRearPos;
public Transform CoverForwardPos;
[Header("Sight Local Positions & Rotations")]
public Vector3 SightDownLocalPos;
public Vector3 SightUpLocalPos;
public Vector3 SightDownRot;
public Vector3 SightUpRot;
[Header("Interaction Settings")]
[Range(0f, 1f)]
public float CoverThreshold = 0.95f;
private bool sightUp = false;
public override void UpdateInteraction(FVRViveHand hand)
{
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_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_00e9: Unknown result type (might be due to invalid IL or missing references)
//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: 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_0118: Unknown result type (might be due to invalid IL or missing references)
//IL_0129: 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_0135: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).UpdateInteraction(hand);
if (!((Object)(object)Sight == (Object)null) && !((Object)(object)CoverRearPos == (Object)null) && !((Object)(object)CoverForwardPos == (Object)null))
{
Vector3 closestValidPoint = ((FVRInteractiveObject)this).GetClosestValidPoint(CoverRearPos.position, CoverForwardPos.position, ((HandInput)(ref hand.Input)).Pos);
float num = Vector3.Distance(CoverRearPos.position, closestValidPoint) / Vector3.Distance(CoverRearPos.position, CoverForwardPos.position);
num = Mathf.Clamp01(num);
if ((Object)(object)Cover != (Object)null)
{
Cover.position = Vector3.Lerp(CoverRearPos.position, CoverForwardPos.position, num);
}
else
{
((Component)this).transform.position = Vector3.Lerp(CoverRearPos.position, CoverForwardPos.position, num);
}
Sight.localPosition = Vector3.Lerp(SightDownLocalPos, SightUpLocalPos, num);
Sight.localEulerAngles = Vector3.Lerp(SightDownRot, SightUpRot, num);
if (num >= CoverThreshold && !sightUp)
{
sightUp = true;
}
else if (num < CoverThreshold && sightUp)
{
sightUp = false;
}
}
}
}
public class Arwen : FVRFireArm
{
[Header("Arwen 37mm Config")]
public Transform CylinderArm;
public ArwenCylinder Cylinder;
public FVRFireArmChamber[] Chambers;
public Transform Trigger;
public Transform Hammer;
[Header("Ejection")]
public Transform EjectionPos;
public Vector3 EjectionVelocity = new Vector3(0.2f, 0.5f, 0f);
public Vector3 EjectionSpin = new Vector3(0f, 200f, 0f);
[Header("Trigger Movement")]
public bool TriggerUsesRotation = true;
public Vector3 TriggerRotationAxis = Vector3.right;
public float TriggerMinAngle = 0f;
public float TriggerMaxAngle = 30f;
public bool TriggerUsesTranslation = false;
public Vector3 TriggerTranslationAxis = Vector3.back;
public float TriggerMinPosition = 0f;
public float TriggerMaxPosition = 0.02f;
[Header("Hammer Movement")]
public bool HammerUsesRotation = true;
public Vector3 HammerRotationAxis = Vector3.right;
public float HammerMinAngle = 0f;
public float HammerMaxAngle = 45f;
public bool HammerUsesTranslation = false;
public Vector3 HammerTranslationAxis = Vector3.back;
public float HammerMinPosition = 0f;
public float HammerMaxPosition = 0.01f;
[Header("Cylinder Rotation")]
public float CylinderRotateDuration = 0.2f;
private int m_curChamber = 0;
private bool m_isCylinderArmLocked = true;
private Coroutine cylinderRotationCoroutine;
private bool m_hasTriggerCycled = false;
public bool CanGrabFromChamber(int chamberIndex)
{
return chamberIndex == m_curChamber;
}
public void LoadShell(FireArmRoundClass round)
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
if (!Chambers[m_curChamber].IsFull)
{
Chambers[m_curChamber].Autochamber(round);
RotateToNextChamberSmooth();
}
}
public override void UpdateInteraction(FVRViveHand hand)
{
((FVRPhysicalObject)this).UpdateInteraction(hand);
float num = ((!((Object)(object)hand != (Object)null)) ? 0f : hand.Input.TriggerFloat);
UpdateTriggerAndHammer(num);
if ((Object)(object)hand != (Object)null && m_isCylinderArmLocked)
{
if (num > 0.95f && !m_hasTriggerCycled)
{
FireCurrentChamber();
RotateToNextChamberSmooth();
m_hasTriggerCycled = true;
}
else if (num < 0.1f)
{
m_hasTriggerCycled = false;
}
}
}
private void UpdateTriggerAndHammer(float triggerValue)
{
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: 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_00fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)Trigger != (Object)null)
{
if (TriggerUsesRotation)
{
float num = Mathf.Lerp(TriggerMinAngle, TriggerMaxAngle, triggerValue);
Trigger.localRotation = Quaternion.AngleAxis(num, TriggerRotationAxis);
}
if (TriggerUsesTranslation)
{
float num2 = Mathf.Lerp(TriggerMinPosition, TriggerMaxPosition, triggerValue);
Trigger.localPosition = ((Vector3)(ref TriggerTranslationAxis)).normalized * num2;
}
}
if ((Object)(object)Hammer != (Object)null)
{
if (HammerUsesRotation)
{
float num3 = Mathf.Lerp(HammerMinAngle, HammerMaxAngle, triggerValue);
Hammer.localRotation = Quaternion.AngleAxis(num3, HammerRotationAxis);
}
if (HammerUsesTranslation)
{
float num4 = Mathf.Lerp(HammerMinPosition, HammerMaxPosition, triggerValue);
Hammer.localPosition = ((Vector3)(ref HammerTranslationAxis)).normalized * num4;
}
}
}
private void FireCurrentChamber()
{
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: Unknown result type (might be due to invalid IL or missing references)
//IL_0122: Unknown result type (might be due to invalid IL or missing references)
//IL_0139: Unknown result type (might be due to invalid IL or missing references)
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: 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_00ca: Unknown result type (might be due to invalid IL or missing references)
if (Chambers[m_curChamber].IsFull && !Chambers[m_curChamber].IsSpent)
{
Chambers[m_curChamber].Fire();
((FVRFireArm)this).Fire(Chambers[m_curChamber], (!((Object)(object)base.MuzzlePos != (Object)null)) ? ((Component)this).transform : base.MuzzlePos, true, 1f, -1f);
if ((Object)(object)EjectionPos != (Object)null)
{
Chambers[m_curChamber].EjectRound(EjectionPos.position, EjectionVelocity, EjectionSpin, EjectionPos.position, EjectionPos.rotation, false);
}
else
{
Chambers[m_curChamber].EjectRound(((Component)Chambers[m_curChamber]).transform.position + ((Component)Chambers[m_curChamber]).transform.forward * 0.1f, ((Component)Chambers[m_curChamber]).transform.forward, Vector3.up * 2f, true);
}
}
}
private void RotateToNextChamberSmooth()
{
int num = (m_curChamber + 1) % Chambers.Length;
if (cylinderRotationCoroutine != null)
{
((MonoBehaviour)this).StopCoroutine(cylinderRotationCoroutine);
}
cylinderRotationCoroutine = ((MonoBehaviour)this).StartCoroutine(RotateCylinderSmoothly(m_curChamber, num));
m_curChamber = num;
}
private IEnumerator RotateCylinderSmoothly(int fromIndex, int toIndex)
{
if (!((Object)(object)Cylinder == (Object)null))
{
Quaternion startRot = ((Component)Cylinder).transform.localRotation;
Quaternion endRot = Cylinder.GetLocalRotationFromCylinder(toIndex);
float t = 0f;
float duration = Mathf.Max(0.01f, CylinderRotateDuration);
while (t < 1f)
{
t += Time.deltaTime / duration;
((Component)Cylinder).transform.localRotation = Quaternion.Slerp(startRot, endRot, t);
yield return null;
}
((Component)Cylinder).transform.localRotation = endRot;
}
}
public void OnShellRemoved(int chamberIndex)
{
if (chamberIndex != m_curChamber || Chambers[chamberIndex].IsFull)
{
return;
}
int previousLoadedChamber = GetPreviousLoadedChamber(chamberIndex);
if (previousLoadedChamber != chamberIndex)
{
if (cylinderRotationCoroutine != null)
{
((MonoBehaviour)this).StopCoroutine(cylinderRotationCoroutine);
}
cylinderRotationCoroutine = ((MonoBehaviour)this).StartCoroutine(RotateCylinderSmoothly(m_curChamber, previousLoadedChamber));
m_curChamber = previousLoadedChamber;
}
}
private int GetPreviousLoadedChamber(int fromIndex)
{
int num = Chambers.Length;
for (int i = 1; i < num; i++)
{
int num2 = (fromIndex - i + num) % num;
if (Chambers[num2].IsFull)
{
return num2;
}
}
return fromIndex;
}
}
public class ArwenCylinder : FVRInteractiveObject
{
[Header("Arwen Cylinder Config")]
public Arwen Arwen;
public int numChambers = 5;
public float CartridgeLength = 0.1f;
public GameObject MoonClip;
private float m_fakeAngularVel;
private float m_timeSinceEject;
public string SpeedLoaderID;
private bool m_hasSpeedLoadedIn;
public bool HasSpeedLoadedIn => m_hasSpeedLoadedIn;
public override void Awake()
{
}
public void LoadFromSpeedLoader(Speedloader loader)
{
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
SpeedLoaderID = ((FVRPhysicalObject)loader).ObjectWrapper.ItemID;
m_hasSpeedLoadedIn = true;
bool flag = false;
for (int i = 0; i < loader.Chambers.Count; i++)
{
if (i < Arwen.Chambers.Length && loader.Chambers[i].IsLoaded && !Arwen.Chambers[i].IsFull)
{
if (!loader.Chambers[i].IsSpent)
{
Arwen.Chambers[i].SetRound(loader.Chambers[i].Unload(), ((Component)loader.Chambers[i]).transform.position, ((Component)loader.Chambers[i]).transform.rotation);
flag = true;
}
else
{
Arwen.Chambers[i].Autochamber(loader.Chambers[i].Unload());
Arwen.Chambers[i].Fire();
flag = true;
}
}
}
if (flag)
{
((FVRFireArm)Arwen).PlayAudioEvent((FirearmAudioEventType)20, 1f);
if ((Object)(object)MoonClip != (Object)null)
{
MoonClip.SetActive(true);
}
}
}
public string Eject()
{
m_timeSinceEject = 0f;
if ((Object)(object)MoonClip != (Object)null)
{
MoonClip.SetActive(false);
}
m_hasSpeedLoadedIn = false;
return SpeedLoaderID;
}
public bool CanAccept()
{
return m_timeSinceEject > 0.2f;
}
public override void UpdateInteraction(FVRViveHand hand)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = ((Component)Arwen).transform.InverseTransformDirection(hand.Input.VelLinearWorld);
}
public override void EndInteraction(FVRViveHand hand)
{
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
m_fakeAngularVel = (0f - ((Component)Arwen).transform.InverseTransformDirection(hand.Input.VelLinearWorld).y) * 120f;
m_fakeAngularVel = Mathf.Clamp(m_fakeAngularVel, -360f, 360f);
}
private void Update()
{
//IL_0045: 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_0059: Unknown result type (might be due to invalid IL or missing references)
if (m_timeSinceEject < 1f)
{
m_timeSinceEject += Time.deltaTime;
}
if (!ArwenIsCylinderArmLocked())
{
((Component)this).transform.localEulerAngles = new Vector3(0f, 0f, ((Component)this).transform.localEulerAngles.z + m_fakeAngularVel);
if (Mathf.Abs(m_fakeAngularVel) > 0f)
{
m_fakeAngularVel = Mathf.Lerp(m_fakeAngularVel, 0f, Time.deltaTime * 0.8f);
}
}
else
{
m_fakeAngularVel = 0f;
}
}
public int GetClosestChamberIndex()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
float num = 0f - ((Component)this).transform.localEulerAngles.z;
num += 360f / (float)numChambers * 0.5f;
num = Mathf.Repeat(num, 360f);
return Mathf.CeilToInt(num / (360f / (float)numChambers)) - 1;
}
public Quaternion GetLocalRotationFromCylinder(int cylinder)
{
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
float num = (float)cylinder * (360f / (float)numChambers) * -1f;
num = Mathf.Repeat(num, 360f);
return Quaternion.Euler(new Vector3(0f, 0f, num));
}
private bool ArwenIsCylinderArmLocked()
{
return (Object)(object)Arwen != (Object)null && (bool)((object)Arwen).GetType().GetField("m_isCylinderArmLocked", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(Arwen);
}
}
public class BouncingBetty : PinnedGrenade
{
[Header("Betty Settings")]
public float BounceHeight = 2f;
public float ExplosionDelay = 0.5f;
public float ArmDelay = 0.4f;
[Header("Proximity Settings")]
public float ProxRange = 3f;
public LayerMask LM_Prox;
[Header("Parts")]
public GameObject BottomPartToDisable;
public AudioEvent LaunchSound;
public AudioEvent ArmSound;
[Header("Stick Settings")]
[Tooltip("Point Z to direction to check. If an layer object is within 0.05m from the raycastdir, it will lock.")]
public Transform RaycastDir;
public LayerMask StickLayer;
[Tooltip("If velocity is below this, it will allow it to lock.")]
public float MinStickVelocity = 0.1f;
private bool isArmed = false;
private bool isSet = false;
private bool hasBounced = false;
private bool beginCountdown = false;
private float timer = 0f;
private bool timerReached = false;
private bool hasExploded = false;
private bool isPinPulled = false;
private bool isStuck = false;
private bool isLocked = false;
private Vector3 stuckNormal;
private Transform stuckToSurface;
public override void Awake()
{
((PinnedGrenade)this).Awake();
base.m_isLeverReleased = true;
base.m_isFused = false;
base.m_fuseTime = float.MaxValue;
base.m_startFuseTime = float.MaxValue;
base.FuseOnSpawn = false;
if ((Object)(object)base.FakeHandle != (Object)null)
{
base.FakeHandle.SetActive(false);
}
if ((Object)(object)base.RealHandle != (Object)null)
{
base.RealHandle.SetActive(false);
}
if ((Object)(object)base.LeverJoint != (Object)null)
{
Object.Destroy((Object)(object)base.LeverJoint);
}
}
public override void FVRUpdate()
{
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
((PinnedGrenade)this).FVRUpdate();
if (base.m_rings.Count > 0)
{
isPinPulled = true;
foreach (PinnedGrenadeRing ring in base.m_rings)
{
if (!ring.HasPinDetached())
{
isPinPulled = false;
}
}
}
if (!isPinPulled || isStuck || !((FVRInteractiveObject)this).IsHeld)
{
}
if (isStuck && !beginCountdown && !isArmed)
{
BeginArming();
}
if (beginCountdown && !timerReached)
{
timer += Time.deltaTime;
if (timer >= ArmDelay)
{
isSet = true;
beginCountdown = false;
timerReached = true;
isArmed = true;
}
}
if (isSet && isArmed && !hasBounced && !hasExploded)
{
Collider[] array = Physics.OverlapSphere(((Component)this).transform.position, ProxRange, LayerMask.op_Implicit(LM_Prox));
if (array.Length > 0)
{
hasBounced = true;
((MonoBehaviour)this).StartCoroutine(BounceAndExplode());
}
}
}
public override void OnCollisionEnter(Collision collision)
{
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: 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_008c: Unknown result type (might be due to invalid IL or missing references)
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
if (isPinPulled && !isStuck && !((FVRInteractiveObject)this).IsHeld && ((1 << collision.gameObject.layer) & (LayerMask.GetMask(new string[1] { "Default" }) | LayerMask.GetMask(new string[1] { "Environment" }))) != 0)
{
ContactPoint val = collision.contacts[0];
((Component)this).transform.position = ((ContactPoint)(ref val)).point;
stuckNormal = ((ContactPoint)(ref val)).normal;
stuckToSurface = collision.transform;
Rigidbody component = ((Component)this).GetComponent<Rigidbody>();
if ((Object)(object)component != (Object)null)
{
component.isKinematic = true;
component.velocity = Vector3.zero;
component.angularVelocity = Vector3.zero;
}
isStuck = true;
if ((Object)(object)BottomPartToDisable != (Object)null)
{
BottomPartToDisable.SetActive(false);
}
}
}
private void BeginArming()
{
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
beginCountdown = true;
timer = 0f;
if (ArmSound != null)
{
SM.PlayCoreSound((FVRPooledAudioType)0, ArmSound, ((Component)this).transform.position);
}
}
private IEnumerator BounceAndExplode()
{
Rigidbody rb = ((Component)this).GetComponent<Rigidbody>();
if ((Object)(object)rb == (Object)null)
{
rb = ((Component)this).gameObject.AddComponent<Rigidbody>();
}
rb.isKinematic = false;
float bounceVel = Mathf.Sqrt(19.62f * BounceHeight);
rb.velocity = Vector3.zero;
rb.AddForce(Vector3.up * bounceVel, (ForceMode)2);
if (LaunchSound != null)
{
SM.PlayCoreSound((FVRPooledAudioType)0, LaunchSound, ((Component)this).transform.position);
}
yield return (object)new WaitForSeconds(ExplosionDelay);
TriggerExplosion();
}
private void TriggerExplosion()
{
//IL_0032: 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)
if (hasExploded)
{
return;
}
hasExploded = true;
for (int i = 0; i < base.SpawnOnSplode.Count; i++)
{
GameObject val = Object.Instantiate<GameObject>(base.SpawnOnSplode[i], ((Component)this).transform.position, Quaternion.identity);
Explosion component = val.GetComponent<Explosion>();
if ((Object)(object)component != (Object)null)
{
component.IFF = base.IFF;
}
ExplosionSound component2 = val.GetComponent<ExplosionSound>();
if ((Object)(object)component2 != (Object)null)
{
component2.IFF = base.IFF;
}
GrenadeExplosion component3 = val.GetComponent<GrenadeExplosion>();
if ((Object)(object)component3 != (Object)null)
{
component3.IFF = base.IFF;
}
}
if ((Object)(object)base.SmokeEmitter != (Object)null)
{
base.SmokeEmitter.Engaged = true;
}
Object.Destroy((Object)(object)((Component)this).gameObject);
}
private void OnDrawGizmosSelected()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(((Component)this).transform.position, ProxRange);
}
public override void FVRFixedUpdate()
{
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
((PinnedGrenade)this).FVRFixedUpdate();
base.m_isImpactFuseActive = false;
base.m_impactFuseBurnDown = float.MaxValue;
Rigidbody component = ((Component)this).GetComponent<Rigidbody>();
if ((Object)(object)component != (Object)null && !isStuck && isPinPulled && !((FVRInteractiveObject)this).IsHeld)
{
Vector3 velocity = component.velocity;
RaycastHit val = default(RaycastHit);
if (((Vector3)(ref velocity)).magnitude <= MinStickVelocity && (Object)(object)RaycastDir != (Object)null && Physics.Raycast(RaycastDir.position, RaycastDir.forward, ref val, 2f, LayerMask.op_Implicit(StickLayer)))
{
isStuck = true;
isLocked = true;
component.isKinematic = true;
component.velocity = Vector3.zero;
component.angularVelocity = Vector3.zero;
((Component)this).transform.position = ((RaycastHit)(ref val)).point;
stuckNormal = ((RaycastHit)(ref val)).normal;
stuckToSurface = ((RaycastHit)(ref val)).transform;
if ((Object)(object)BottomPartToDisable != (Object)null)
{
BottomPartToDisable.SetActive(false);
}
}
}
if (isLocked && ((FVRInteractiveObject)this).IsHeld)
{
isLocked = false;
if ((Object)(object)component != (Object)null)
{
component.isKinematic = false;
}
}
}
}
namespace VolksScripts
{
public class BreacherDrone : FVRPhysicalObject, IFVRDamageable
{
[Serializable]
public class WingAnimator
{
public Transform Wing;
public Vector3 FoldedLocalEulers = Vector3.zero;
public Vector3 DeployedLocalEulers = new Vector3(0f, 0f, 90f);
[Tooltip("How fast the wing moves (0→1 per second). 2 = fully deployed in 0.5s.")]
public float AnimSpeed = 2f;
}
[Serializable]
public class PropellerSpinner
{
public enum SpinAxis
{
X,
Y,
Z
}
public Transform Propeller;
public SpinAxis Axis = SpinAxis.Y;
[Tooltip("Max spin speed in degrees per second.")]
public float MaxSpinSpeed = 1800f;
[Tooltip("How fast spin ramps up/down (degrees per second squared).")]
public float RampSpeed = 900f;
[HideInInspector]
public float CurrentSpeed = 0f;
}
[Header("Wings & Propellers")]
public List<WingAnimator> Wings = new List<WingAnimator>();
public List<PropellerSpinner> Propellers = new List<PropellerSpinner>();
[Header("Activation Effects")]
[Tooltip("Mesh GameObject toggled ON when the drone is activated (e.g. an LED or glow mesh).")]
public GameObject ActivatedMesh;
public AudioSource ActivationSound;
public AudioSource PropellerLoopSound;
[Header("Flight")]
[Tooltip("Continuous thrust force (N) in the drone's forward direction while flying.")]
public float ThrustForce = 5f;
[Tooltip("Radius of the forward SphereCast used to detect impacts. Increase if drone tunnels through thin walls.")]
public float ImpactCheckRadius = 0.05f;
[Tooltip("Minimum lookahead distance (metres) for the impact SphereCast. Automatically scales with speed.")]
public float ImpactCheckDistance = 0.15f;
[Header("Arm Delay")]
[Tooltip("Seconds after launch before collision can trigger detonation. Prevents accidental explosion on release.")]
public float ArmDelay = 1f;
[Header("Explosion — Collision")]
[Tooltip("Layers that trigger detonation on contact once armed.")]
public LayerMask ExplosionLayerMask;
[Tooltip("If true, any collision triggers detonation instead of only matching layers.")]
public bool ExplodeOnAnyCollision = false;
[Header("Explosion — Timer")]
[Tooltip("Seconds after launch before auto-detonation. 0 = disabled.")]
public float AutoDestructTime = 15f;
[Header("Explosion — Beeping")]
[Tooltip("AudioSource for the beep (short one-shot clip). Assigned on the GameObject — NOT pooled.")]
public AudioSource BeepAudioSource;
[Tooltip("Remaining seconds on the timer at which beeping begins.")]
public float BeepStartAtSeconds = 5f;
public float BeepPitchStart = 1f;
public float BeepPitchEnd = 2f;
[Tooltip("Beep interval at start (seconds).")]
public float BeepRefireStart = 0.8f;
[Tooltip("Beep interval at end (seconds).")]
public float BeepRefireEnd = 0.05f;
[Header("Explosion — Shot")]
public bool ExplodeOnShot = true;
public float ShotDamageThreshold = 10f;
[Header("Explosion — Payload")]
public List<GameObject> SpawnOnExplode = new List<GameObject>();
public int IFF;
[Header("Debug")]
public bool EnableDebug = false;
private bool m_isActivated = false;
private bool m_isLaunched = false;
private bool m_hasExploded = false;
private bool m_isArmed = false;
private float m_armTimer = 0f;
private float m_autoDestructTimer = 0f;
private float m_beepTimer = 0f;
private float[] m_wingLerps;
public override void Awake()
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_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)
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
((FVRPhysicalObject)this).Awake();
Collider component = ((Component)this).GetComponent<Collider>();
if ((Object)(object)component != (Object)null)
{
Bounds bounds = component.bounds;
Vector3 extents = ((Bounds)(ref bounds)).extents;
ImpactCheckRadius = ((Vector3)(ref extents)).magnitude * 0.5f;
}
m_wingLerps = new float[Wings.Count];
for (int i = 0; i < Wings.Count; i++)
{
m_wingLerps[i] = 0f;
if ((Object)(object)Wings[i].Wing != (Object)null)
{
Wings[i].Wing.localEulerAngles = Wings[i].FoldedLocalEulers;
}
}
if ((Object)(object)ActivatedMesh != (Object)null)
{
ActivatedMesh.SetActive(false);
}
if ((Object)(object)PropellerLoopSound != (Object)null)
{
PropellerLoopSound.Stop();
}
if ((Object)(object)BeepAudioSource != (Object)null)
{
BeepAudioSource.Stop();
}
}
private void OnDrawGizmosSelected()
{
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: 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_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: 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_00b9: 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_00df: Unknown result type (might be due to invalid IL or missing references)
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
Gizmos.color = new Color(1f, 0.4f, 0f, 0.35f);
Gizmos.DrawSphere(((Component)this).transform.position, ImpactCheckRadius);
Gizmos.color = new Color(1f, 0.4f, 0f, 0.9f);
Gizmos.DrawWireSphere(((Component)this).transform.position, ImpactCheckRadius);
Vector3 val = ((Component)this).transform.position + ((Component)this).transform.forward * ImpactCheckDistance;
Gizmos.color = new Color(1f, 0.8f, 0f, 0.9f);
Gizmos.DrawLine(((Component)this).transform.position, val);
Gizmos.DrawWireSphere(val, ImpactCheckRadius);
Handles.color = new Color(1f, 0.8f, 0f, 0.5f);
Handles.Label(val + Vector3.up * (ImpactCheckRadius + 0.05f), "Impact lookahead: " + ImpactCheckDistance.ToString("F2") + "m");
}
public void ToggleActivation()
{
if (m_hasExploded || m_isLaunched)
{
return;
}
m_isActivated = !m_isActivated;
if (m_isActivated)
{
if ((Object)(object)ActivatedMesh != (Object)null)
{
ActivatedMesh.SetActive(true);
}
if ((Object)(object)ActivationSound != (Object)null)
{
ActivationSound.Stop();
ActivationSound.Play();
}
if ((Object)(object)PropellerLoopSound != (Object)null)
{
PropellerLoopSound.loop = true;
PropellerLoopSound.Play();
}
}
else
{
if ((Object)(object)ActivatedMesh != (Object)null)
{
ActivatedMesh.SetActive(false);
}
if ((Object)(object)PropellerLoopSound != (Object)null)
{
PropellerLoopSound.Stop();
}
}
DebugLog("Toggled — activated: " + m_isActivated);
}
public override void EndInteraction(FVRViveHand hand)
{
if (m_isActivated && !m_isLaunched && !m_hasExploded)
{
m_isLaunched = true;
m_isArmed = false;
m_armTimer = 0f;
if (AutoDestructTime > 0f)
{
m_autoDestructTimer = AutoDestructTime;
m_beepTimer = 0f;
}
if ((Object)(object)((FVRPhysicalObject)this).RootRigidbody != (Object)null)
{
((FVRPhysicalObject)this).RootRigidbody.collisionDetectionMode = (CollisionDetectionMode)2;
}
DebugLog("Launched! Arm delay: " + ArmDelay + "s Auto-destruct: " + AutoDestructTime + "s");
}
((FVRPhysicalObject)this).EndInteraction(hand);
}
public override void FVRFixedUpdate()
{
//IL_003f: 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_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_00ab: 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)
//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: 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_00e8: Unknown result type (might be due to invalid IL or missing references)
((FVRPhysicalObject)this).FVRFixedUpdate();
if (!m_isLaunched || m_hasExploded || (Object)(object)((FVRPhysicalObject)this).RootRigidbody == (Object)null)
{
return;
}
((FVRPhysicalObject)this).RootRigidbody.AddForce(((Component)this).transform.forward * ThrustForce, (ForceMode)0);
if (m_isArmed)
{
Vector3 velocity = ((FVRPhysicalObject)this).RootRigidbody.velocity;
float magnitude = ((Vector3)(ref velocity)).magnitude;
float num = Mathf.Max(ImpactCheckDistance, magnitude * Time.fixedDeltaTime * 2f);
Vector3 val = ((!(magnitude > 0.01f)) ? ((Component)this).transform.forward : ((Vector3)(ref velocity)).normalized);
LayerMask val2 = ((!ExplodeOnAnyCollision) ? ExplosionLayerMask : LayerMask.op_Implicit(-1));
RaycastHit val3 = default(RaycastHit);
if (Physics.SphereCast(((Component)this).transform.position, ImpactCheckRadius, val, ref val3, num, LayerMask.op_Implicit(val2), (QueryTriggerInteraction)1))
{
DebugLog("SphereCast impact: " + ((Object)((Component)((RaycastHit)(ref val3)).collider).gameObject).name);
Explode();
}
}
}
public override void FVRUpdate()
{
((FVRPhysicalObject)this).FVRUpdate();
UpdateWings();
UpdatePropellers();
UpdateArming();
UpdateAutoDestruct();
}
public override void OnCollisionEnter(Collision col)
{
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
((FVRPhysicalObject)this).OnCollisionEnter(col);
if (m_isLaunched && m_isArmed && !m_hasExploded && (ExplodeOnAnyCollision || ((1 << col.gameObject.layer) & LayerMask.op_Implicit(ExplosionLayerMask)) != 0))
{
DebugLog("Collision detonation.");
Explode();
}
}
public void Damage(Damage d)
{
if (!m_hasExploded && ExplodeOnShot && d.Dam_TotalKinetic >= ShotDamageThreshold)
{
DebugLog("Shot detonation — damage: " + d.Dam_TotalKinetic.ToString("F2"));
Explode();
}
}
private void UpdateArming()
{
if (m_isLaunched && !m_isArmed && !m_hasExploded)
{
m_armTimer += Time.deltaTime;
if (m_armTimer >= ArmDelay)
{
m_isArmed = true;
DebugLog("Armed.");
}
}
}
private void UpdateAutoDestruct()
{
if (!m_isLaunched || m_hasExploded || AutoDestructTime <= 0f)
{
return;
}
m_autoDestructTimer -= Time.deltaTime;
if ((Object)(object)BeepAudioSource != (Object)null && m_autoDestructTimer <= BeepStartAtSeconds && m_autoDestructTimer > 0f)
{
m_beepTimer -= Time.deltaTime;
if (m_beepTimer <= 0f)
{
float num = Mathf.Clamp01(1f - m_autoDestructTimer / BeepStartAtSeconds);
num = Mathf.Pow(num, 2f);
m_beepTimer = Mathf.Lerp(BeepRefireStart, BeepRefireEnd, num);
BeepAudioSource.pitch = Mathf.Lerp(BeepPitchStart, BeepPitchEnd, num);
BeepAudioSource.Play();
}
}
if (m_autoDestructTimer <= 0f)
{
DebugLog("Auto-destruct triggered.");
Explode();
}
}
private void UpdateWings()
{
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
float num = ((!m_isActivated) ? 0f : 1f);
for (int i = 0; i < Wings.Count; i++)
{
WingAnimator wingAnimator = Wings[i];
if (!((Object)(object)wingAnimator.Wing == (Object)null))
{
m_wingLerps[i] = Mathf.MoveTowards(m_wingLerps[i], num, wingAnimator.AnimSpeed * Time.deltaTime);
float num2 = m_wingLerps[i];
wingAnimator.Wing.localEulerAngles = new Vector3(Mathf.LerpAngle(wingAnimator.FoldedLocalEulers.x, wingAnimator.DeployedLocalEulers.x, num2), Mathf.LerpAngle(wingAnimator.FoldedLocalEulers.y, wingAnimator.DeployedLocalEulers.y, num2), Mathf.LerpAngle(wingAnimator.FoldedLocalEulers.z, wingAnimator.DeployedLocalEulers.z, num2));
}
}
}
private void UpdatePropellers()
{
for (int i = 0; i < Propellers.Count; i++)
{
PropellerSpinner propellerSpinner = Propellers[i];
if ((Object)(object)propellerSpinner.Propeller == (Object)null)
{
continue;
}
float num = ((!m_isActivated) ? 0f : propellerSpinner.MaxSpinSpeed);
propellerSpinner.CurrentSpeed = Mathf.MoveTowards(propellerSpinner.CurrentSpeed, num, propellerSpinner.RampSpeed * Time.deltaTime);
if (!(Mathf.Abs(propellerSpinner.CurrentSpeed) < Mathf.Epsilon))
{
float num2 = propellerSpinner.CurrentSpeed * Time.deltaTime;
switch (propellerSpinner.Axis)
{
case PropellerSpinner.SpinAxis.X:
propellerSpinner.Propeller.Rotate(num2, 0f, 0f, (Space)1);
break;
case PropellerSpinner.SpinAxis.Y:
propellerSpinner.Propeller.Rotate(0f, num2, 0f, (Space)1);
break;
case PropellerSpinner.SpinAxis.Z:
propellerSpinner.Propeller.Rotate(0f, 0f, num2, (Space)1);
break;
}
}
}
}
private void Explode()
{
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
if (m_hasExploded)
{
return;
}
m_hasExploded = true;
m_isActivated = false;
if ((Object)(object)PropellerLoopSound != (Object)null)
{
PropellerLoopSound.Stop();
}
if ((Object)(object)BeepAudioSource != (Object)null)
{
BeepAudioSource.Stop();
}
if ((Object)(object)ActivatedMesh != (Object)null)
{
ActivatedMesh.SetActive(false);
}
for (int i = 0; i < SpawnOnExplode.Count; i++)
{
if (!((Object)(object)SpawnOnExplode[i] == (Object)null))
{
GameObject val = Object.Instantiate<GameObject>(SpawnOnExplode[i], ((Component)this).transform.position, Quaternion.identity);
Explosion component = val.GetComponent<Explosion>();
if ((Object)(object)component != (Object)null)
{
component.IFF = IFF;
}
ExplosionSound component2 = val.GetComponent<ExplosionSound>();
if ((Object)(object)component2 != (Object)null)
{
component2.IFF = IFF;
}
GrenadeExplosion component3 = val.GetComponent<GrenadeExplosion>();
if ((Object)(object)component3 != (Object)null)
{
component3.IFF = IFF;
}
}
}
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);
}
private void DebugLog(string msg)
{
if (EnableDebug)
{
Debug.Log((object)("[BreacherDrone] " + msg));
}
}
}
public class BreacherDroneButton : FVRInteractiveObject
{
[Header("Breacher Drone Button")]
public BreacherDrone Drone;
[Tooltip("Minimum time (seconds) between presses.")]
public float PressCooldown = 0.3f;
[Header("Press Animation")]
[Tooltip("The transform to animate on press (the button visual mesh).")]
public Transform ButtonVisual;
public Vector3 RestLocalPos = Vector3.zero;
public Vector3 RestLocalRot = Vector3.zero;
public Vector3 PressedLocalPos = new Vector3(0f, -0.002f, 0f);
public Vector3 PressedLocalRot = Vector3.zero;
[Tooltip("Time in seconds to reach the pressed position.")]
public float PressDuration = 0.05f;
[Tooltip("Time in seconds to return to rest.")]
public float ReturnDuration = 0.1f;
private float m_lastPressTime = -1f;
private bool m_isAnimating = false;
private bool m_isReturning = false;
private float m_animLerp = 0f;
public override void SimpleInteraction(FVRViveHand hand)
{
if (!((Object)(object)Drone == (Object)null) && !(Time.time - m_lastPressTime < PressCooldown) && !m_isAnimating)
{
m_lastPressTime = Time.time;
((FVRInteractiveObject)this).SimpleInteraction(hand);
Drone.ToggleActivation();
if ((Object)(object)ButtonVisual != (Object)null)
{
m_isAnimating = true;
m_isReturning = false;
m_animLerp = 0f;
}
}
}
public override void FVRUpdate()
{
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
//IL_0143: Unknown result type (might be due to invalid IL or missing references)
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
//IL_015a: Unknown result type (might be due to invalid IL or missing references)
//IL_0165: 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_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
//IL_010f: Unknown result type (might be due to invalid IL or missing references)
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).FVRUpdate();
if (!m_isAnimating || (Object)(object)ButtonVisual == (Object)null)
{
return;
}
float num = ((!m_isReturning) ? PressDuration : ReturnDuration);
m_animLerp += Time.deltaTime / num;
if (m_animLerp >= 1f)
{
m_animLerp = 1f;
if (m_isReturning)
{
m_isAnimating = false;
m_animLerp = 0f;
ButtonVisual.localPosition = RestLocalPos;
ButtonVisual.localEulerAngles = RestLocalRot;
return;
}
m_isReturning = true;
m_animLerp = 0f;
}
if (m_isReturning)
{
ButtonVisual.localPosition = Vector3.Lerp(PressedLocalPos, RestLocalPos, m_animLerp);
ButtonVisual.localEulerAngles = Vector3.Lerp(PressedLocalRot, RestLocalRot, m_animLerp);
}
else
{
ButtonVisual.localPosition = Vector3.Lerp(RestLocalPos, PressedLocalPos, m_animLerp);
ButtonVisual.localEulerAngles = Vector3.Lerp(RestLocalRot, PressedLocalRot, m_animLerp);
}
}
}
public class BriefcaseNukeButton : FVRInteractiveObject
{
public enum NukeButtonType
{
Number,
Confirm,
Reset
}
[Header("Briefcase Nuke Button")]
public Briefcase_Nuke Nuke;
public NukeButtonType ButtonType = NukeButtonType.Number;
[Tooltip("The number this button types (0-9). Only used when ButtonType is Number.")]
public int NumberValue;
[Tooltip("Minimum time (seconds) between button presses.")]
public float PressCooldown = 0.25f;
[Header("Press Animation")]
[Tooltip("The transform to animate (the button visual mesh). If null, no animation plays.")]
public Transform ButtonVisual;
[Tooltip("Local position of the button at rest.")]
public Vector3 RestLocalPos = Vector3.zero;
[Tooltip("Local rotation of the button at rest.")]
public Vector3 RestLocalRot = Vector3.zero;
[Tooltip("Local position of the button when fully pressed.")]
public Vector3 PressedLocalPos = new Vector3(0f, -0.002f, 0f);
[Tooltip("Local rotation of the button when fully pressed.")]
public Vector3 PressedLocalRot = Vector3.zero;
[Tooltip("Time in seconds for the button to go from rest to pressed.")]
public float PressDuration = 0.05f;
[Tooltip("Time in seconds for the button to return from pressed to rest.")]
public float ReturnDuration = 0.1f;
private bool m_isAnimating = false;
private bool m_isReturning = false;
private float m_animLerp = 0f;
private float m_lastPressTime = -1f;
public override void SimpleInteraction(FVRViveHand hand)
{
if (!((Object)(object)Nuke == (Object)null) && !((Object)(object)((FVRPhysicalObject)Nuke).QuickbeltSlot != (Object)null) && !m_isAnimating && !(Time.time - m_lastPressTime < PressCooldown))
{
m_lastPressTime = Time.time;
((FVRInteractiveObject)this).SimpleInteraction(hand);
switch (ButtonType)
{
case NukeButtonType.Number:
Nuke.TypeNumber(NumberValue);
break;
case NukeButtonType.Confirm:
Nuke.ConfirmAndStart(hand);
break;
case NukeButtonType.Reset:
Nuke.ResetTimer(hand);
break;
}
if ((Object)(object)ButtonVisual != (Object)null)
{
m_isAnimating = true;
m_animLerp = 0f;
m_isReturning = false;
}
}
}
public override void FVRUpdate()
{
//IL_012d: Unknown result type (might be due to invalid IL or missing references)
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
//IL_0139: 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_0150: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: 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_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
//IL_010f: Unknown result type (might be due to invalid IL or missing references)
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).FVRUpdate();
if (!m_isAnimating || (Object)(object)ButtonVisual == (Object)null)
{
return;
}
m_animLerp += Time.deltaTime / ((!m_isReturning) ? PressDuration : ReturnDuration);
if (m_animLerp >= 1f)
{
m_animLerp = 1f;
if (m_isReturning)
{
m_isAnimating = false;
m_animLerp = 0f;
ButtonVisual.localPosition = RestLocalPos;
ButtonVisual.localEulerAngles = RestLocalRot;
return;
}
m_isReturning = true;
m_animLerp = 0f;
}
float animLerp = m_animLerp;
if (m_isReturning)
{
ButtonVisual.localPosition = Vector3.Lerp(PressedLocalPos, RestLocalPos, animLerp);
ButtonVisual.localEulerAngles = Vector3.Lerp(PressedLocalRot, RestLocalRot, animLerp);
}
else
{
ButtonVisual.localPosition = Vector3.Lerp(RestLocalPos, PressedLocalPos, animLerp);
ButtonVisual.localEulerAngles = Vector3.Lerp(RestLocalRot, PressedLocalRot, animLerp);
}
}
}
public class Briefcase_Nuke : FVRPhysicalObject, IFVRDamageable
{
private int[] digits = new int[5];
private float m_remainingTime;
private bool m_isCounting;
private bool m_hasDetonated;
private float m_lastTickTime;
private float m_tick1Timer;
private float m_tick2Timer;
[Header("Timer Display")]
public Text TimerText;
[Header("Armed Indicator")]
public GameObject CountdownIndicator;
[Header("Armed State Visuals")]
public List<GameObject> ArmedObjects = new List<GameObject>();
public List<GameObject> DisarmedObjects = new List<GameObject>();
public List<ParticleSystem> ArmedParticles = new List<ParticleSystem>();
[Header("Explosion")]
public List<GameObject> SpawnOnDetonate = new List<GameObject>();
[Header("Tick Audio 1 — Main Countdown")]
[Tooltip("AudioSource on this GameObject for the per-second tick. Play On Awake OFF.")]
public AudioSource Tick1AudioSource;
public bool Tick1UsePitchRamp = true;
public float Tick1PitchStart = 1f;
public float Tick1PitchEnd = 1.5f;
public float Tick1PitchRampOverSeconds = 30f;
[Header("Tick Audio 2 — Urgent Countdown")]
[Tooltip("AudioSource on this GameObject for the urgent tick. Play On Awake OFF.")]
public AudioSource Tick2AudioSource;
public float Tick2StartAtSeconds = 10f;
public float Tick2Interval = 0.5f;
public bool Tick2UsePitchRamp = false;
public float Tick2PitchStart = 1f;
public float Tick2PitchEnd = 1.8f;
[Header("Audio")]
public AudioEvent AudEvent_DigitChange;
public AudioEvent AudEvent_Confirm;
public AudioEvent AudEvent_Reset;
public AudioEvent AudEvent_Error;
public void TypeNumber(int number)
{
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
if (!m_isCounting && !m_hasDetonated && number >= 0 && number <= 9)
{
for (int i = 0; i < 4; i++)
{
digits[i] = digits[i + 1];
}
digits[4] = number;
digits[1] = Mathf.Min(digits[1], 5);
digits[3] = Mathf.Min(digits[3], 5);
SM.PlayGenericSound(AudEvent_DigitChange, ((Component)this).transform.position);
UpdateDisplay();
}
}
public void ConfirmAndStart(FVRViveHand hand)
{
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
if (!m_hasDetonated && (!((FVRInteractiveObject)this).IsHeld || !((Object)(object)hand == (Object)(object)((FVRInteractiveObject)this).m_hand)) && !m_isCounting)
{
float totalSecondsFromDigits = GetTotalSecondsFromDigits();
if (totalSecondsFromDigits <= 0f)
{
SM.PlayGenericSound(AudEvent_Error, ((Component)this).transform.position);
return;
}
m_remainingTime = totalSecondsFromDigits;
m_isCounting = true;
m_lastTickTime = m_remainingTime;
m_tick1Timer = 0f;
m_tick2Timer = 0f;
SM.PlayGenericSound(AudEvent_Confirm, ((Component)this).transform.position);
SetArmedState(armed: true);
UpdateDisplay();
}
}
public void ResetTimer(FVRViveHand hand)
{
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
if (!m_hasDetonated && (!((FVRInteractiveObject)this).IsHeld || !((Object)(object)hand == (Object)(object)((FVRInteractiveObject)this).m_hand)))
{
m_isCounting = false;
m_remainingTime = 0f;
m_tick1Timer = 0f;
m_tick2Timer = 0f;
for (int i = 0; i < 5; i++)
{
digits[i] = 0;
}
if ((Object)(object)Tick1AudioSource != (Object)null)
{
Tick1AudioSource.Stop();
}
if ((Object)(object)Tick2AudioSource != (Object)null)
{
Tick2AudioSource.Stop();
}
SM.PlayGenericSound(AudEvent_Reset, ((Component)this).transform.position);
SetArmedState(armed: false);
UpdateDisplay();
}
}
private void SetArmedState(bool armed)
{
if ((Object)(object)CountdownIndicator != (Object)null)
{
CountdownIndicator.SetActive(armed);
}
for (int i = 0; i < ArmedObjects.Count; i++)
{
if ((Object)(object)ArmedObjects[i] != (Object)null)
{
ArmedObjects[i].SetActive(armed);
}
}
for (int j = 0; j < DisarmedObjects.Count; j++)
{
if ((Object)(object)DisarmedObjects[j] != (Object)null)
{
DisarmedObjects[j].SetActive(!armed);
}
}
for (int k = 0; k < ArmedParticles.Count; k++)
{
if (!((Object)(object)ArmedParticles[k] == (Object)null))
{
if (armed)
{
ArmedParticles[k].Play();
}
else
{
ArmedParticles[k].Stop(true, (ParticleSystemStopBehavior)0);
}
}
}
}
public override void FVRUpdate()
{
((FVRPhysicalObject)this).FVRUpdate();
if (!m_hasDetonated && m_isCounting)
{
m_remainingTime -= Time.deltaTime;
TickAudio1();
TickAudio2();
m_lastTickTime = m_remainingTime;
UpdateDigitsFromTime();
UpdateDisplay();
if (m_remainingTime <= 0f)
{
m_remainingTime = 0f;
Detonate();
}
}
}
private void TickAudio1()
{
if ((Object)(object)Tick1AudioSource == (Object)null || (Object)(object)Tick1AudioSource.clip == (Object)null)
{
return;
}
float num = Mathf.Ceil(m_remainingTime);
if (!(num >= Mathf.Ceil(m_lastTickTime)) && !(m_remainingTime <= 0f))
{
if (Tick1UsePitchRamp)
{
float num2 = Mathf.Clamp01(1f - m_remainingTime / Tick1PitchRampOverSeconds);
num2 = Mathf.Pow(num2, 2f);
Tick1AudioSource.pitch = Mathf.Lerp(Tick1PitchStart, Tick1PitchEnd, num2);
}
else
{
Tick1AudioSource.pitch = Tick1PitchStart;
}
Tick1AudioSource.Play();
}
}
private void TickAudio2()
{
if ((Object)(object)Tick2AudioSource == (Object)null || (Object)(object)Tick2AudioSource.clip == (Object)null || m_remainingTime > Tick2StartAtSeconds)
{
return;
}
m_tick2Timer -= Time.deltaTime;
if (!(m_tick2Timer > 0f))
{
m_tick2Timer = Tick2Interval;
if (Tick2UsePitchRamp)
{
float num = Mathf.Clamp01(1f - m_remainingTime / Tick2StartAtSeconds);
num = Mathf.Pow(num, 2f);
Tick2AudioSource.pitch = Mathf.Lerp(Tick2PitchStart, Tick2PitchEnd, num);
}
else
{
Tick2AudioSource.pitch = Tick2PitchStart;
}
Tick2AudioSource.Play();
}
}
private void Detonate()
{
//IL_0089: 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)
if (m_hasDetonated)
{
return;
}
m_hasDetonated = true;
m_isCounting = false;
if ((Object)(object)Tick1AudioSource != (Object)null)
{
Tick1AudioSource.Stop();
}
if ((Object)(object)Tick2AudioSource != (Object)null)
{
Tick2AudioSource.Stop();
}
for (int i = 0; i < SpawnOnDetonate.Count; i++)
{
if ((Object)(object)SpawnOnDetonate[i] != (Object)null)
{
Object.Instantiate<GameObject>(SpawnOnDetonate[i], ((Component)this).transform.position, ((Component)this).transform.rotation);
}
}
Object.Destroy((Object)(object)((Component)this).gameObject);
}
public void Damage(Damage d)
{
if (!((FVRInteractiveObject)this).IsHeld && !((Object)(object)((FVRPhysicalObject)this).QuickbeltSlot != (Object)null))
{
m_isCounting = true;
m_remainingTime = Mathf.Min(m_remainingTime, Random.Range(0.1f, 0.3f));
}
}
private void UpdateDisplay()
{
if ((Object)(object)TimerText != (Object)null)
{
TimerText.text = $"{digits[0]}:{digits[1]}{digits[2]}:{digits[3]}{digits[4]}";
}
}
private void UpdateDigitsFromTime()
{
int num = Mathf.CeilToInt(Mathf.Max(0f, m_remainingTime));
int num2 = num / 3600;
int num3 = num % 3600 / 60;
int num4 = num % 60;
digits[0] = Mathf.Clamp(num2, 0, 9);
digits[1] = num3 / 10;
digits[2] = num3 % 10;
digits[3] = num4 / 10;
digits[4] = num4 % 10;
}
private float GetTotalSecondsFromDigits()
{
int num = digits[0];
int num2 = digits[1] * 10 + digits[2];
int num3 = digits[3] * 10 + digits[4];
return (float)num * 3600f + (float)num2 * 60f + (float)num3;
}
}
public class IceGrenade : PinnedGrenade
{
public GameObject pullPinEffectObject;
public Material newMaterial;
private Material originalMaterial;
private Renderer grenadeRenderer;
private bool materialChanged = false;
public override void Start()
{
((FVRInteractiveObject)this).Start();
grenadeRenderer = ((Component)this).GetComponentInChildren<Renderer>();
if ((Object)(object)grenadeRenderer != (Object)null)
{
originalMaterial = grenadeRenderer.material;
}
if ((Object)(object)pullPinEffectObject != (Object)null)
{
pullPinEffectObject.SetActive(false);
}
}
public override void FVRUpdate()
{
((PinnedGrenade)this).FVRUpdate();
if (base.m_isPinPulled && !materialChanged)
{
if ((Object)(object)pullPinEffectObject != (Object)null && !pullPinEffectObject.activeSelf)
{
pullPinEffectObject.SetActive(true);
}
if ((Object)(object)grenadeRenderer != (Object)null && (Object)(object)newMaterial != (Object)null)
{
grenadeRenderer.material = newMaterial;
materialChanged = true;
}
}
}
}
}
public class Idle : StateMachineBehaviour
{
}
public class LazeTargeting : FVRPhysicalObject
{
[Header("Laze Settings")]
public Transform LaserOrigin;
public LayerMask LazeLayerMask;
public GameObject ArrowIndicator;
public Image FillBar;
public Text StatusText;
public AudioEvent ConfirmedSound;
public AudioEvent DeniedSound;
public AudioEvent ErrorSound;
[Tooltip("List of possible strike prefabs. First is default.")]
public List<GameObject> StrikePrefabs;
public float HoldTimeToConfirm = 2f;
public float CooldownTime = 5f;
public float MaxLazeDistance = 500f;
public float SpawnAltitude = 100f;
public int StrikeCount = 1;
public float StrikeInterval = 0.2f;
public float StrikeSpread = 0f;
public LayerMask SkyObstructionMask;
[Header("Strike Type UI")]
public GameObject StrikeTypeUI;
[Header("Laser Visuals")]
public LaserLight laserLight;
public AudioEvent LaserOnSound;
public AudioEvent LaserOffSound;
[Header("Strike Type Text")]
public GameObject TextRoot;
public Text TextField;
[Header("Strike Knob Visual")]
public Transform StrikeKnobMesh;
[Tooltip("Set true for translation, false for rotation, per strike type.")]
public bool[] UseTranslationForStrike;
public Vector3 KnobTranslation = new Vector3(0f, 0.02f, 0f);
public Vector3 KnobRotation = new Vector3(0f, 30f, 0f);
[Header("Laser Button Visual")]
public Transform LaserButtonMesh;
public Vector3 LaserButtonDefaultLocalPos = Vector3.zero;
public Vector3 LaserButtonPressedLocalPos = new Vector3(0f, -0.01f, 0f);
private float holdTimer = 0f;
private float cooldownTimer = 0f;
private bool isLazing = false;
private RaycastHit hit;
private int currentStrikeIndex = 0;
private bool isStrikeTypeUIActive = false;
private bool isButtonHeld = false;
private float buttonHeldTime = 0f;
private bool hasEventFiredSincePress = false;
private float holdToOpenStrikeUI = 0.6f;
private bool m_isLaserOn = false;
public override void FVRUpdate()
{
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: 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_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_0677: Unknown result type (might be due to invalid IL or missing references)
//IL_015f: Unknown result type (might be due to invalid IL or missing references)
//IL_0161: 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_0200: Unknown result type (might be due to invalid IL or missing references)
//IL_05f5: Unknown result type (might be due to invalid IL or missing references)
//IL_0616: Unknown result type (might be due to invalid IL or missing references)
//IL_0599: Unknown result type (might be due to invalid IL or missing references)
//IL_0422: Unknown result type (might be due to invalid IL or missing references)
//IL_0427: Unknown result type (might be due to invalid IL or missing references)
//IL_0432: Unknown result type (might be due to invalid IL or missing references)
//IL_0437: Unknown result type (might be due to invalid IL or missing references)
//IL_043c: Unknown result type (might be due to invalid IL or missing references)
//IL_0448: Unknown result type (might be due to invalid IL or missing references)
//IL_0477: Unknown result type (might be due to invalid IL or missing references)
//IL_048f: Unknown result type (might be due to invalid IL or missing references)
//IL_0503: Unknown result type (might be due to invalid IL or missing references)
//IL_0539: Unknown result type (might be due to invalid IL or missing references)
//IL_055a: Unknown result type (might be due to invalid IL or missing references)
//IL_04c8: Unknown result type (might be due to invalid IL or missing references)
//IL_04e0: Unknown result type (might be due to invalid IL or missing references)
((FVRPhysicalObject)this).FVRUpdate();
UpdateLaserVisual();
Vector3 position = LaserOrigin.position;
Vector3 forward = LaserOrigin.forward;
float num = 1000f;
bool flag = Physics.Raycast(position, forward, ref hit, num, LayerMask.op_Implicit(LazeLayerMask));
Vector3 position2;
Vector3 up;
if (flag)
{
position2 = ((RaycastHit)(ref hit)).point;
up = ((RaycastHit)(ref hit)).normal;
}
else
{
position2 = position + forward * num;
up = Vector3.up;
}
if ((Object)(object)ArrowIndicator != (Object)null)
{
ArrowIndicator.transform.position = position2;
ArrowIndicator.transform.up = up;
ArrowIndicator.SetActive(true);
}
if ((Object)(object)LaserButtonMesh != (Object)null)
{
LaserButtonMesh.localPosition = ((!m_isLaserOn) ? LaserButtonDefaultLocalPos : LaserButtonPressedLocalPos);
}
FVRViveHand hand = ((FVRInteractiveObject)this).m_hand;
if ((Object)(object)hand != (Object)null)
{
Vector2 touchpadAxes = hand.Input.TouchpadAxes;
bool flag2 = (hand.IsInStreamlinedMode && hand.Input.BYButtonDown) || (!hand.IsInStreamlinedMode && hand.Input.TouchpadDown && Vector2.Angle(touchpadAxes, Vector2.up) <= 45f);
bool flag3 = (hand.IsInStreamlinedMode && hand.Input.BYButtonUp) || (!hand.IsInStreamlinedMode && hand.Input.TouchpadUp);
if ((hand.IsInStreamlinedMode && hand.Input.AXButtonDown) || (!hand.IsInStreamlinedMode && hand.Input.TouchpadDown && Vector2.Angle(hand.Input.TouchpadAxes, Vector2.left) < 45f))
{
ToggleLaser();
}
if (flag2)
{
isButtonHeld = true;
hasEventFiredSincePress = false;
buttonHeldTime = 0f;
}
if (flag3)
{
if (!hasEventFiredSincePress && buttonHeldTime < holdToOpenStrikeUI && StrikePrefabs != null && StrikePrefabs.Count > 0)
{
currentStrikeIndex = (currentStrikeIndex + 1) % StrikePrefabs.Count;
ShowStrikeText();
UpdateStrikeKnobVisual();
}
isButtonHeld = false;
buttonHeldTime = 0f;
if (isStrikeTypeUIActive)
{
isStrikeTypeUIActive = false;
if ((Object)(object)StrikeTypeUI != (Object)null)
{
StrikeTypeUI.SetActive(false);
}
}
}
if (isButtonHeld && !hasEventFiredSincePress)
{
buttonHeldTime += Time.deltaTime;
if (buttonHeldTime >= holdToOpenStrikeUI)
{
hasEventFiredSincePress = true;
isStrikeTypeUIActive = !isStrikeTypeUIActive;
if ((Object)(object)StrikeTypeUI != (Object)null)
{
StrikeTypeUI.SetActive(isStrikeTypeUIActive);
}
if (isStrikeTypeUIActive)
{
ShowStrikeText();
}
}
}
if (m_isLaserOn && hand.Input.TriggerPressed && cooldownTimer <= 0f && !isStrikeTypeUIActive)
{
if (flag)
{
holdTimer += Time.deltaTime;
FillBar.fillAmount = holdTimer / HoldTimeToConfirm;
StatusText.text = "Lazing...";
if (holdTimer >= HoldTimeToConfirm)
{
bool flag4 = ((RaycastHit)(ref hit)).distance > MaxLazeDistance;
bool flag5 = Physics.Raycast(((RaycastHit)(ref hit)).point + Vector3.up * SpawnAltitude, Vector3.down, SpawnAltitude, LayerMask.op_Implicit(SkyObstructionMask));
if (flag4)
{
StatusText.text = "Target too far!";
((Graphic)FillBar).color = Color.red;
SM.PlayCoreSound((FVRPooledAudioType)10, DeniedSound, ((RaycastHit)(ref hit)).point);
holdTimer = 0f;
return;
}
if (flag5)
{
StatusText.text = "No sky sight!";
((Graphic)FillBar).color = Color.red;
SM.PlayCoreSound((FVRPooledAudioType)10, ErrorSound, ((RaycastHit)(ref hit)).point);
holdTimer = 0f;
return;
}
((MonoBehaviour)this).StartCoroutine(SpawnStrikeBarrage(((RaycastHit)(ref hit)).point, StrikeCount, StrikeInterval, StrikeSpread, SpawnAltitude));
SM.PlayCoreSound((FVRPooledAudioType)10, ConfirmedSound, ((RaycastHit)(ref hit)).point);
StatusText.text = "Strike Confirmed!";
((Graphic)FillBar).color = Color.green;
cooldownTimer = CooldownTime;
holdTimer = 0f;
}
}
else
{
StatusText.text = "No Target";
((Graphic)FillBar).color = Color.red;
FillBar.fillAmount = 0f;
holdTimer = 0f;
}
}
else
{
if (holdTimer > 0f && cooldownTimer <= 0f)
{
SM.PlayCoreSound((FVRPooledAudioType)10, DeniedSound, ((Component)this).transform.position);
StatusText.text = "Cancelled";
((Graphic)FillBar).color = Color.red;
}
holdTimer = 0f;
FillBar.fillAmount = 0f;
}
}
if (cooldownTimer > 0f)
{
cooldownTimer -= Time.deltaTime;
StatusText.text = "Cooldown...";
((Graphic)FillBar).color = Color.yellow;
}
}
private void UpdateLaserVisual()
{
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)laserLight == (Object)null) && !((Object)(object)LaserOrigin == (Object)null))
{
laserLight.LaserAperture.position = LaserOrigin.position;
laserLight.LaserAperture.rotation = LaserOrigin.rotation;
laserLight.IsActive = m_isLaserOn;
}
}
public void ToggleLaser()
{
//IL_0056: 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)
m_isLaserOn = !m_isLaserOn;
if ((Object)(object)laserLight != (Object)null)
{
laserLight.IsActive = m_isLaserOn;
}
if (m_isLaserOn && LaserOnSound != null)
{
SM.PlayCoreSound((FVRPooledAudioType)10, LaserOnSound, ((Component)this).transform.position);
}
else if (!m_isLaserOn && LaserOffSound != null)
{
SM.PlayCoreSound((FVRPooledAudioType)10, LaserOffSound, ((Component)this).transform.position);
}
}
public void SetStrikeIndex(int idx)
{
if (StrikePrefabs != null && StrikePrefabs.Count != 0)
{
currentStrikeIndex = Mathf.Clamp(idx, 0, StrikePrefabs.Count - 1);
ShowStrikeText();
UpdateStrikeKnobVisual();
}
}
private void ShowStrikeText()
{
if ((Object)(object)TextField != (Object)null && StrikePrefabs != null && StrikePrefabs.Count > 0)
{
TextField.text = "Strike: " + ((Object)StrikePrefabs[currentStrikeIndex]).name;
if ((Object)(object)TextRoot != (Object)null)
{
TextRoot.SetActive(true);
}
((MonoBehaviour)this).StopCoroutine("HideStrikeText");
((MonoBehaviour)this).StartCoroutine("HideStrikeText");
}
if ((Object)(object)StatusText != (Object)null && StrikePrefabs != null && StrikePrefabs.Count > 0)
{
StatusText.text = "Strike: " + ((Object)StrikePrefabs[currentStrikeIndex]).name;
}
}
private void UpdateStrikeKnobVisual()
{
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)StrikeKnobMesh == (Object)null) && StrikePrefabs != null && StrikePrefabs.Count != 0)
{
int num = currentStrikeIndex;
bool flag = false;
if (UseTranslationForStrike != null && num < UseTranslationForStrike.Length)
{
flag = UseTranslationForStrike[num];
}
if (flag)
{
StrikeKnobMesh.localPosition = KnobTranslation * (float)num;
StrikeKnobMesh.localRotation = Quaternion.identity;
}
else
{
StrikeKnobMesh.localPosition = Vector3.zero;
StrikeKnobMesh.localRotation = Quaternion.Euler(KnobRotation * (float)num);
}
}
}
private IEnumerator HideStrikeText()
{
yield return (object)new WaitForSeconds(1f);
if ((Object)(object)TextRoot != (Object)null)
{
TextRoot.SetActive(false);
}
}
private IEnumerator SpawnStrikeBarrage(Vector3 target, int count, float interval, float spread, float altitude)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
Debug.Log((object)("SpawnStrikeBarrage called. Prefab count: " + ((StrikePrefabs == null) ? "null" : StrikePrefabs.Count.ToString())));
for (int i = 0; i < count; i++)
{
Vector3 offset = (Vector3)((!(spread > 0f)) ? Vector3.zero : new Vector3(Random.Range(0f - spread, spread), 0f, Random.Range(0f - spread, spread)));
Vector3 spawnPos = target + offset + Vector3.up * altitude;
if (StrikePrefabs != null && StrikePrefabs.Count > 0 && (Object)(object)StrikePrefabs[currentStrikeIndex] != (Object)null)
{
Debug.Log((object)("Spawning prefab: " + ((Object)StrikePrefabs[currentStrikeIndex]).name + " at " + spawnPos));
Object.Instantiate<GameObject>(StrikePrefabs[currentStrikeIndex], spawnPos, Quaternion.identity);
}
else
{
Debug.LogError((object)"Strike prefab is null or not assigned!");
}
yield return (object)new WaitForSeconds(interval);
}
}
}
public class FVRCappedGrenadeCapExtended : FVRCappedGrenadeCap
{
[Header("Extra Behaviours")]
public GameObject EnableOnRemove;
public GameObject ExplosionPrefab;
public LayerMask TriggerLayers;
public float ImpactVelocity = 2f;
private bool _isRemoved = false;
public override void BeginInteraction(FVRViveHand hand)
{
((FVRCappedGrenadeCap)this).BeginInteraction(hand);
if (!_isRemoved)
{
_isRemoved = true;
if ((Object)(object)EnableOnRemove != (Object)null)
{
EnableOnRemove.SetActive(true);
}
}
}
private void OnCollisionEnter(Collision col)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: 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_006f: Unknown result type (might be due to invalid IL or missing references)
if (!_isRemoved)
{
return;
}
Vector3 relativeVelocity = col.relativeVelocity;
if (((Vector3)(ref relativeVelocity)).magnitude > ImpactVelocity && ((1 << col.gameObject.layer) & ((LayerMask)(ref TriggerLayers)).value) != 0)
{
if ((Object)(object)ExplosionPrefab != (Object)null)
{
Object.Instantiate<GameObject>(ExplosionPrefab, ((Component)this).transform.position, Quaternion.identity);
}
Object.Destroy((Object)(object)((Component)this).gameObject);
}
}
}
public class LungeMine : FVRCappedGrenade
{
[Header("Lunge Mine Settings")]
public bool ExplodeOnAnyContactWhenArmed = false;
public LayerMask TriggerLayers = LayerMask.op_Implicit(-1);
public bool ForceArmOnPrimaryCap = true;
public float MinArmedDelay = 0f;
private bool m_isArmed = false;
private float m_armedTime = -1f;
private bool m_prevObservedArmedState = false;
public override void Start()
{
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
((FVRCappedGrenade)this).Start();
base.FuseType = (CappedGrenadeFuseType)1;
if (ForceArmOnPrimaryCap)
{
base.UsesSecondaryCap = false;
}
}
private void Update()
{
bool flag = (ForceArmOnPrimaryCap ? base.IsPrimaryCapRemoved : ((!base.UsesSecondaryCap) ? base.IsPrimaryCapRemoved : (base.IsPrimaryCapRemoved && base.IsSecondaryCapRemoved)));
if (flag && !m_prevObservedArmedState)
{
m_isArmed = true;
m_armedTime = Time.time;
}
else if (!flag && m_prevObservedArmedState)
{
m_isArmed = false;
m_armedTime = -1f;
}
m_prevObservedArmedState = flag;
}
public override void OnCollisionEnter(Collision col)
{
//IL_0067: 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_0099: Unknown result type (might be due to invalid IL or missing references)
((FVRCappedGrenade)this).OnCollisionEnter(col);
if (!m_isArmed || (MinArmedDelay > 0f && m_armedTime > 0f && Time.time - m_armedTime < MinArmedDelay) || ((1 << col.gameObject.layer) & LayerMask.op_Implicit(TriggerLayers)) == 0)
{
return;
}
if (ExplodeOnAnyContactWhenArmed)
{
((FVRCappedGrenade)this).Explode();
return;
}
Vector3 relativeVelocity = col.relativeVelocity;
float magnitude = ((Vector3)(ref relativeVelocity)).magnitude;
if (magnitude >= base.ImpactFuseVelThreshold)
{
((FVRCappedGrenade)this).Explode();
}
}
public void Disarm()
{
m_isArmed = false;
m_armedTime = -1f;
}
public void ForceDetonate()
{
((FVRCappedGrenade)this).Explode();
}
}
public class LungeMineProng : MonoBehaviour
{
[Tooltip("If left empty, the script will auto-find FVRCappedGrenade in parent.")]
public FVRCappedGrenade Grenade;
[Tooltip("Which layers can trigger the prong (set in inspector).")]
public LayerMask TriggerLayers = LayerMask.op_Implicit(-1);
[Tooltip("Minimum collision velocity required to trigger.")]
public float MinVelocity = 1f;
[Tooltip("Require grenade to be armed (cap removed) before it can detonate.")]
public bool RequireArmed = true;
[Tooltip("Show debug logs in console.")]
public bool DebugEnabled = false;
private void Start()
{
if ((Object)(object)Grenade == (Object)null)
{
Grenade = ((Component)this).GetComponentInParent<FVRCappedGrenade>();
if (DebugEnabled)
{
Debug.Log((object)("[LungeMineProng] Auto-found grenade: " + ((Object)(object)Grenade != (Object)null)));
}
}
}
private void OnCollisionEnter(Collision col)
{
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
if (DebugEnabled)
{
Debug.Log((object)"[LungeMineProng] OnCollisionEnter called.");
}
if (DebugEnabled)
{
Rigidbody component = ((Component)this).GetComponent<Rigidbody>();
Collider component2 = ((Component)this).GetComponent<Collider>();
Debug.Log((object)("[LungeMineProng] Rigidbody: " + ((Object)(object)component != (Object)null) + " Collider: " + ((Object)(object)component2 != (Object)null)));
}
if ((Object)(object)Grenade == (Object)null)
{
if (DebugEnabled)
{
Debug.Log((object)"[LungeMineProng] No grenade reference.");
}
return;
}
if (((1 << col.gameObject.layer) & ((LayerMask)(ref TriggerLayers)).value) == 0)
{
if (DebugEnabled)
{
Debug.Log((object)("[LungeMineProng] Wrong layer: " + LayerMask.LayerToName(col.gameObject.layer)));
}
return;
}
Vector3 relativeVelocity = col.relativeVelocity;
float magnitude = ((Vector3)(ref relativeVelocity)).magnitude;
if (magnitude < MinVelocity)
{
if (DebugEnabled)
{
Debug.Log((object)("[LungeMineProng] Hit too soft: " + magnitude));
}
return;
}
bool flag = true;
if (RequireArmed)
{
PropertyInfo property = ((object)Grenade).GetType().GetProperty("IsPrimaryCapRemoved");
if ((object)property != null)
{
flag = (bool)property.GetValue(Grenade, null);
}
else
{
if (DebugEnabled)
{
Debug.Log((object)"[LungeMineProng] Could not find IsPrimaryCapRemoved property.");
}
flag = false;
}
}
if (!flag)
{
if (DebugEnabled)
{
Debug.Log((object)"[LungeMineProng] Grenade not armed yet.");
}
return;
}
if (DebugEnabled)
{
Debug.Log((object)("[LungeMineProng] Detonating! Velocity: " + magnitude + " Object: " + ((Object)col.gameObject).name));
}
((Component)Grenade).gameObject.SendMessage("Explode", (SendMessageOptions)1);
}
}
namespace Volks.PuntGuns
{
[BepInPlugin("Volks.PuntGuns", "PuntGuns", "1.0.0")]
[BepInProcess("h3vr.exe")]
[Description("Built with MeatKit")]
[BepInDependency("h3vr.otherloader", "1.3.0")]
public class PuntGunsPlugin : BaseUnityPlugin
{
private static readonly string BasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
internal static ManualLogSource Logger;
private void Awake()
{
Logger = ((BaseUnityPlugin)this).Logger;
LoadAssets();
}
private void LoadAssets()
{
Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "Volks.PuntGuns");
OtherLoader.RegisterDirectLoad(BasePath, "Volks.PuntGuns", "", "", "puntgun_set", "");
}
}
}
public class AttachableHammerFirearm : AttachableFirearm
{
[Header("Hammer Params")]
public Transform Hammer;
public bool HasVisibleHammer = true;
public bool CanCockHammer = true;
public Axis HammerAxis;
public InterpStyle HammerInterp = (InterpStyle)1;
public float HammerMinRot;
public float HammerMaxRot = -70f;
[Header("Trigger Params")]
public Transform Trigger;
public Vector2 TriggerForwardBackRots;
[Header("Chamber")]
public FVRFireArmChamber Chamber;
private bool m_isHammerCocked;
private bool m_isTriggerReset = true;
public void CockHammer()
{
//IL_003f: 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)
if (!m_isHammerCocked && CanCockHammer)
{
m_isHammerCocked = true;
if ((Object)(object)Hammer != (Object)null)
{
SetAnimatedComponent(Hammer, HammerMaxRot, HammerInterp, HammerAxis);
}
((AttachableFirearm)this).PlayAudioEvent((FirearmAudioEventType)7, 1f);
}
}
public void SetHammerCocked(bool cocked)
{
//IL_003b: 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)
m_isHammerCocked = cocked;
if ((Object)(object)Hammer != (Object)null)
{
float rot = ((!cocked) ? HammerMinRot : HammerMaxRot);
SetAnimatedComponent(Hammer, rot, HammerInterp, HammerAxis);
}
}
public override void ProcessInput(FVRViveHand hand, bool fromInterface, FVRInteractiveObject o)
{
//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_005f: Unknown result type (might be due to invalid IL or missing references)
((AttachableFirearm)this).ProcessInput(hand, fromInterface, o);
if ((Object)(object)Trigger != (Object)null)
{
float triggerFloat = hand.Input.TriggerFloat;
float x = Mathf.Lerp(TriggerForwardBackRots.x, TriggerForwardBackRots.y, triggerFloat);
Vector3 localEulerAngles = Trigger.localEulerAngles;
localEulerAngles.x = x;
Trigger.localEulerAngles = localEulerAngles;
}
if (CanCockHammer)
{
if (hand.IsInStreamlinedMode)
{
if (hand.Input.BYButtonDown)
{
CockHammer();
}
}
else if (hand.Input.TouchpadUp)
{
CockHammer();
}
}
if (m_isHammerCocked && hand.Input.TriggerFloat > 0.7f && m_isTriggerReset)
{
m_isTriggerReset = false;
SetHammerCocked(cocked: false);
if ((Object)(object)Chamber != (Object)null && Chamber.IsFull && !Chamber.IsSpent)
{
FireHammerAction(fromInterface);
}
else
{
((AttachableFirearm)this).PlayAudioEvent((FirearmAudioEventType)16, 1f);
}
}
else if (hand.Input.TriggerFloat < 0.2f && !m_isTriggerReset)
{
m_isTriggerReset = true;
}
}
private void FireHammerAction(bool firedFromInterface)
{
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)Chamber != (Object)null && Chamber.Fire())
{
((AttachableFirearm)this).FireMuzzleSmoke();
((AttachableFirearm)this).Fire(Chamber, ((AttachableFirearm)this).GetMuzzle(), true, (FVRFireArm)null, 1f);
((AttachableFirearm)this).PlayAudioEvent((FirearmAudioEventType)6, 1f);
((AttachableFirearm)this).PlayAudioGunShot(Chamber.GetRound(), GM.CurrentPlayerBody.GetCurrentSoundEnvironment(), 1f);
Chamber.SetRound((FVRFireArmRound)null, false);
Chamber.UpdateProxyDisplay();
}
}
protected void SetAnimatedComponent(Transform t, float rot, InterpStyle interp, Axis axis)
{
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Invalid comparison between Unknown and I4
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Invalid comparison between Unknown and I4
if ((Object)(object)t == (Object)null)
{
return;
}
Vector3 localEulerAngles = t.localEulerAngles;
if ((int)axis != 0)
{
if ((int)axis != 1)
{
if ((int)axis == 2)
{
localEulerAngles.z = rot;
}
}
else
{
localEulerAngles.y = rot;
}
}
else
{
localEulerAngles.x = rot;
}
t.localEulerAngles = localEulerAngles;
}
}
public class TripwireMine : FVRPhysicalObject
{
[Header("Tripwire Settings")]
public float TripwireMaxRange = 5f;
public Material TripwireValidMat;
public LineRenderer TripwireLineTemplate;
[Header("Parts")]
public GameObject DeployVisual;
[Header("Explosion/Smoke")]
public List<GameObject> SpawnOnTrigger;
public SmokeSolidEmitter SmokeEmitter;
[Header("Audio")]
public AudioEvent TriggerSound;
public AudioEvent PlantMineSound;
[Header("Deployment")]
public LayerMask DeployLayerMask = LayerMask.op_Implicit(-1);
public float DeployCheckDistance = 0.12f;
[Header("Jab Settings")]
public Transform JabOrigin;
public Vector3 JabDirection = Vector3.down;
public float JabSinkDepth = 0.05f;
[Header("Wire/Laser Settings")]
public List<Transform> WireOrigins = new List<Transform>();
public List<Vector3> WireDirections = new List<Vector3> { Vector3.forward };
public LayerMask TripwireTriggerLayerMask = LayerMask.op_Implicit(-1);
public LayerMask WireStopLayerMask = LayerMask.op_Implicit(-1);
[Header("Wire End")]
public GameObject WireEndPrefab;
private bool isPlanted = false;
private bool isArmed = false;
private bool hasDetonated = false;
private float cooldown = 0f;
private float armingTimer = 0f;
public float ArmingDelay = 0.5f;
private bool pendingArming = false;
private List<LineRenderer> TripwireLines = new List<LineRenderer>();
private List<bool> hasPlacedWireEnd = new List<bool>();
private List<GameObject> spawnedWireEnds = new List<GameObject>();
public override void Awake()
{
((FVRPhysicalObject)this).Awake();
}
public override void Start()
{
((FVRInteractiveObject)this).Start();
TripwireLines.Clear();
hasPlacedWireEnd.Clear();
spawnedWireEnds.Clear();
for (int i = 0; i < WireDirections.Count; i++)
{
LineRenderer val = null;
if ((Object)(object)TripwireLineTemplate != (Object)null)
{
val = Object.Instantiate<LineRenderer>(TripwireLineTemplate, ((Component)this).transform);
((Renderer)val).enabled = false;
if ((Object)(object)((Renderer)val).material == (Object)null && (Object)(object)TripwireValidMat != (Object)null)
{
((Renderer)val).material = TripwireValidMat;
}
}
TripwireLines.Add(val);
hasPlacedWireEnd.Add(item: false);
spawnedWireEnds.Add(null);
}
if ((Object)(object)DeployVisual != (Object)null)
{
DeployVisual.SetActive(false);
}
}
public override void BeginInteraction(FVRViveHand hand)
{
((FVRPhysicalObject)this).BeginInteraction(hand);
cooldown = 0f;
((FVRPhysicalObject)this).RootRigidbody.isKinematic = false;
}
public override void OnCollisionEnter(Collision col)
{
((FVRPhysicalObject)this).OnCollisionEnter(col);
if (cooldown > 0.5f && ((FVRInteractiveObject)this).IsHeld && (Object)(object)col.collider.attachedRigidbody == (Object)null)
{
((FVRInteractiveObject)this).ForceBreakInteraction();
((FVRPhysicalObject)this).RootRigidbody.isKinematic = true;
}
}
public override void FVRUpdate()
{
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: 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_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: 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)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_0118: Unknown result type (might be due to invalid IL or missing references)
//IL_0144: 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_0147: Unknown result type (might be due to invalid IL or missing references)
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
//IL_0136: Unknown result type (might be due to invalid IL or missing references)
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0413: Unknown result type (might be due to invalid IL or missing references)
//IL_0418: Unknown result type (might be due to invalid IL or missing references)
//IL_0424: Unknown result type (might be due to invalid IL or missing references)
//IL_0429: Unknown result type (might be due to invalid IL or missing references)
//IL_042e: Unknown result type (might be due to invalid IL or missing references)
//IL_0438: Unknown result type (might be due to invalid IL or missing references)
//IL_043a: Unknown result type (might be due to invalid IL or missing references)
//IL_045c: 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)
//IL_0462: 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_0452: Unknown result type (might be due to invalid IL or missing references)
//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
//IL_046c: Unknown result type (might be due to invalid IL or missing references)
//IL_0495: Unknown result type (might be due to invalid IL or missing references)
//IL_04aa: Unknown result type (might be due to invalid IL or missing references)
//IL_04f9: Unknown result type (might be due to invalid IL or missing references)
//IL_0501: Unknown result type (might be due to invalid IL or missing references)
//IL_0264: Unknown result type (might be due to invalid IL or missing references)
//IL_0254: Unknown result type (might be due to invalid IL or missing references)
//IL_0234: Unknown result type (might be due to invalid IL or missing references)