using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Logging;
using FistVR;
using HarmonyLib;
using OpenScripts2;
using OtherLoader;
using Sodalite;
using Sodalite.Api;
using UnityEngine;
using UnityEngine.SceneManagement;
using theWNbotMods;
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
namespace theWNbotMods
{
public class RemoteFire : FVRPhysicalObject
{
[Header("Binding")]
[Tooltip("The firearm to control. Can be assigned in Inspector or at runtime via BindFirearm().")]
public FVRFireArm targetFirearm;
[Tooltip("If true and targetFirearm is null, will try to auto-find a FVRFireArm on the same GameObject or its children in Start().")]
public bool autoFindFirearm = true;
[Header("Trigger Settings")]
[Tooltip("If true, a single TriggerDown will attempt a single fire call.")]
public bool fireOnTriggerDown = true;
[Tooltip("If true, holding trigger will repeatedly call the fire method each frame while held (use with caution).")]
public bool continuousWhileHeld = false;
[Header("Debug")]
[Tooltip("In Inspector, toggle to simulate a trigger press (auto-resets).")]
public bool DebugTriggerOnce = false;
private bool _wasTriggerHeld = false;
private void Start()
{
if ((Object)(object)targetFirearm == (Object)null && autoFindFirearm)
{
targetFirearm = ((Component)this).GetComponentInChildren<FVRFireArm>();
}
}
private void OnValidate()
{
if (!Application.isPlaying && DebugTriggerOnce)
{
DebugTriggerOnce = false;
}
}
private void Update()
{
if (DebugTriggerOnce)
{
DebugTriggerOnce = false;
TryTriggerFire();
}
if (!((Object)(object)((FVRInteractiveObject)this).m_hand != (Object)null))
{
return;
}
if (fireOnTriggerDown && ((FVRInteractiveObject)this).m_hand.Input.TriggerDown)
{
TryTriggerFire();
}
if (continuousWhileHeld)
{
bool triggerPressed = ((FVRInteractiveObject)this).m_hand.Input.TriggerPressed;
if (triggerPressed && !_wasTriggerHeld)
{
TryTriggerFire();
}
else if (triggerPressed && _wasTriggerHeld)
{
TryTriggerFire();
}
_wasTriggerHeld = triggerPressed;
}
}
public void BindFirearm(FVRFireArm firearm)
{
targetFirearm = firearm;
}
public void UnbindFirearm()
{
targetFirearm = null;
}
private void TryTriggerFire()
{
if ((Object)(object)targetFirearm == (Object)null)
{
return;
}
Type type = ((object)targetFirearm).GetType();
MethodInfo method = type.GetMethod("Fire", BindingFlags.Instance | BindingFlags.Public);
if ((object)method != null)
{
try
{
method.Invoke(targetFirearm, null);
return;
}
catch (Exception)
{
}
}
MethodInfo method2 = type.GetMethod("DropHammer", BindingFlags.Instance | BindingFlags.Public);
if ((object)method2 != null)
{
try
{
method2.Invoke(targetFirearm, null);
return;
}
catch (Exception)
{
}
}
MethodInfo method3 = type.GetMethod("CockHammer", BindingFlags.Instance | BindingFlags.Public);
if ((object)method3 != null)
{
try
{
ParameterInfo[] parameters = method3.GetParameters();
if (parameters.Length == 1 && (object)parameters[0].ParameterType == typeof(bool))
{
method3.Invoke(targetFirearm, new object[1] { true });
}
else
{
method3.Invoke(targetFirearm, null);
}
method2?.Invoke(targetFirearm, null);
return;
}
catch (Exception)
{
}
}
try
{
((Component)targetFirearm).gameObject.SendMessage("Fire", (SendMessageOptions)1);
}
catch (Exception)
{
}
}
}
public class AC130TabletLeftHand : FVRInteractiveObject
{
[Header("平板主控制器")]
public AC130TabletRightHand tabletController;
[Header("干扰弹 Prefab")]
public GameObject countermeasurePrefab;
[Header("Debug 模拟输入")]
public bool SimTrigger = false;
public bool SimStickLeft = false;
public bool SimStickRight = false;
public bool SimStickUp = false;
public bool SimStickDown = false;
private Vector2 _lAxes;
public override void UpdateInteraction(FVRViveHand hand)
{
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Invalid comparison between Unknown and I4
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Invalid comparison between Unknown and I4
//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_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Invalid comparison between Unknown and I4
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).UpdateInteraction(hand);
if ((int)hand.HandSource != 1)
{
return;
}
if ((int)hand.CMode == 3 || (int)hand.CMode == 1)
{
_lAxes = hand.Input.Secondary2AxisInputAxes;
}
else
{
_lAxes = hand.Input.TouchpadAxes;
}
if (SimStickLeft)
{
_lAxes.x = -1f;
SimStickLeft = false;
}
if (SimStickRight)
{
_lAxes.x = 1f;
SimStickRight = false;
}
if (SimStickUp)
{
_lAxes.y = 1f;
SimStickUp = false;
}
if (SimStickDown)
{
_lAxes.y = -1f;
SimStickDown = false;
}
if (_lAxes.x > 0.8f)
{
tabletController.CurrentIndex++;
}
else if (_lAxes.x < -0.8f)
{
tabletController.CurrentIndex--;
}
if (hand.Input.TriggerDown || SimTrigger)
{
if ((Object)(object)countermeasurePrefab != (Object)null)
{
countermeasurePrefab.SetActive(true);
}
SimTrigger = false;
}
}
}
public class AC130TabletRightHand : FVRPhysicalObject
{
[Header("炮艇控制器")]
public OrbitalStrikeController[] strikeControllers;
public GameObject[] cannonUIPrefabs;
[Header("摄像头角度限制")]
public Transform cameraPivot;
public float yawLimit = 60f;
public float pitchLimit = 30f;
public float rotationSpeed = 2f;
[Header("Debug 模拟输入")]
public bool SimTrigger = false;
public bool SimStickLeft = false;
public bool SimStickRight = false;
public bool SimStickUp = false;
public bool SimStickDown = false;
private Vector2 _rAxes;
private int currentIndex = 0;
public int CurrentIndex
{
get
{
return currentIndex;
}
set
{
currentIndex = Mathf.Clamp(value, 0, strikeControllers.Length - 1);
UpdateUI();
}
}
public override void UpdateInteraction(FVRViveHand hand)
{
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Invalid comparison between Unknown and I4
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Invalid comparison between Unknown and I4
//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_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Invalid comparison between Unknown and I4
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_0128: Unknown result type (might be due to invalid IL or missing references)
//IL_0163: Unknown result type (might be due to invalid IL or missing references)
((FVRPhysicalObject)this).UpdateInteraction(hand);
if ((int)hand.HandSource != 2)
{
return;
}
if ((int)hand.CMode == 3 || (int)hand.CMode == 1)
{
_rAxes = hand.Input.Secondary2AxisInputAxes;
}
else
{
_rAxes = hand.Input.TouchpadAxes;
}
if (SimStickLeft)
{
_rAxes.x = -1f;
SimStickLeft = false;
}
if (SimStickRight)
{
_rAxes.x = 1f;
SimStickRight = false;
}
if (SimStickUp)
{
_rAxes.y = 1f;
SimStickUp = false;
}
if (SimStickDown)
{
_rAxes.y = -1f;
SimStickDown = false;
}
float num = Mathf.Clamp(cameraPivot.localEulerAngles.y + _rAxes.x * rotationSpeed, 0f - yawLimit, yawLimit);
float num2 = Mathf.Clamp(cameraPivot.localEulerAngles.x - _rAxes.y * rotationSpeed, 0f - pitchLimit, pitchLimit);
cameraPivot.localRotation = Quaternion.Euler(num2, num, 0f);
if (!hand.Input.TriggerDown && !SimTrigger)
{
return;
}
if (strikeControllers != null && strikeControllers.Length > 0)
{
OrbitalStrikeController orbitalStrikeController = strikeControllers[currentIndex];
if ((Object)(object)orbitalStrikeController != (Object)null)
{
orbitalStrikeController.shouldFire = true;
}
}
SimTrigger = false;
}
public void UpdateUI()
{
for (int i = 0; i < cannonUIPrefabs.Length; i++)
{
if ((Object)(object)cannonUIPrefabs[i] != (Object)null)
{
cannonUIPrefabs[i].SetActive(i == currentIndex);
}
}
}
public void SetCurrentIndex(int index)
{
CurrentIndex = index;
}
}
public class AirstrikeBinocular : FVRPhysicalObject
{
[Header("望远镜镜头中心(Ray 起点)")]
public Transform RayOrigin;
[Header("默认空袭 Prefab")]
public GameObject defaultAirstrikePrefab;
[Header("最大射程")]
public float MaxDistance = 500f;
[Header("可命中的层(地面、环境等)")]
public LayerMask HitLayers;
[Header("菜单 UI Canvas")]
public GameObject menuCanvas;
[Header("音效播放")]
public AudioSource audioSource;
private GameObject currentAirstrikePrefab;
private AudioClip[] currentAirstrikeClips;
[Header("调试信息")]
[SerializeField]
private string currentTypeName = "None";
[Header("部署方向设置")]
[SerializeField]
private Vector3 rotationOffsetEuler = Vector3.zero;
[Header("冷却时间设置")]
[SerializeField]
private float cooldownTime = 5f;
private float lastDeployTime = -999f;
[Header("调试开关")]
[SerializeField]
private bool debugTrigger = false;
private void Start()
{
currentAirstrikePrefab = defaultAirstrikePrefab;
currentTypeName = ((!((Object)(object)defaultAirstrikePrefab != (Object)null)) ? "None" : ((Object)defaultAirstrikePrefab).name);
if ((Object)(object)menuCanvas != (Object)null)
{
menuCanvas.SetActive(false);
}
Debug.Log((object)("AirstrikeBinocular当前空袭类型: " + currentTypeName));
}
private void Update()
{
if (debugTrigger)
{
Debug.Log((object)("调试Inspector触发空袭 → " + currentTypeName));
DeployAirstrike(null);
debugTrigger = false;
}
}
public void ToggleMenu(bool isOpen)
{
if ((Object)(object)menuCanvas != (Object)null)
{
menuCanvas.SetActive(isOpen);
}
}
public void SetAirstrikeType(GameObject prefab, AudioClip[] clips)
{
currentAirstrikePrefab = prefab;
currentAirstrikeClips = clips;
currentTypeName = ((!((Object)(object)prefab != (Object)null)) ? "None" : ((Object)prefab).name);
Debug.Log((object)("当前空袭类型切换为: " + currentTypeName));
}
public override void UpdateInteraction(FVRViveHand hand)
{
((FVRPhysicalObject)this).UpdateInteraction(hand);
if (hand.Input.TriggerFloat > 0.8f)
{
DeployAirstrike(hand);
}
}
public void DeployAirstrike(FVRViveHand hand)
{
//IL_0058: 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_0071: 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_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_00bb: 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_00c1: 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_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
//IL_00e1: 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_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
RaycastHit val = default(RaycastHit);
if (Time.time - lastDeployTime < cooldownTime)
{
Debug.Log((object)("冷却中,剩余时间: " + (cooldownTime - (Time.time - lastDeployTime)).ToString("F1") + " 秒"));
}
else if (Physics.Raycast(RayOrigin.position, RayOrigin.forward, ref val, MaxDistance, LayerMask.op_Implicit(HitLayers)))
{
Vector3 forward = RayOrigin.forward;
forward.y = 0f;
if (((Vector3)(ref forward)).sqrMagnitude < 0.001f)
{
forward = Vector3.forward;
}
Quaternion val2 = Quaternion.LookRotation(forward, Vector3.up);
Quaternion val3 = val2 * Quaternion.Euler(rotationOffsetEuler);
Object.Instantiate<GameObject>(currentAirstrikePrefab, ((RaycastHit)(ref val)).point, val3);
Debug.Log((object)string.Concat("释放空袭: ", currentTypeName, " 于位置 ", ((RaycastHit)(ref val)).point, ",旋转: ", ((Quaternion)(ref val3)).eulerAngles));
lastDeployTime = Time.time;
if ((Object)(object)audioSource != (Object)null && currentAirstrikeClips != null && currentAirstrikeClips.Length > 0)
{
AudioClip val4 = currentAirstrikeClips[Random.Range(0, currentAirstrikeClips.Length)];
audioSource.PlayOneShot(val4);
}
if ((Object)(object)hand != (Object)null)
{
hand.Buzz(hand.Buzzer.Buzz_OnHoverInteractive);
}
}
}
}
public class AirstrikeDebugger : MonoBehaviour
{
[Header("移动速度")]
public float moveSpeed = 5f;
[Header("鼠标灵敏度")]
public float mouseSensitivity = 2f;
[Header("头部对象(联动 UILookAtPlayer)")]
public Transform headTransform;
private float rotationX = 0f;
private float rotationY = 0f;
private void Start()
{
Cursor.lockState = (CursorLockMode)1;
Cursor.visible = false;
}
private void Update()
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: 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_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: 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_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_0116: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: 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)
float axis = Input.GetAxis("Horizontal");
float axis2 = Input.GetAxis("Vertical");
Vector3 val = (((Component)this).transform.right * axis + ((Component)this).transform.forward * axis2) * moveSpeed * Time.deltaTime;
Transform transform = ((Component)this).transform;
transform.position += val;
float num = Input.GetAxis("Mouse X") * mouseSensitivity;
float num2 = Input.GetAxis("Mouse Y") * mouseSensitivity;
rotationY += num;
rotationX -= num2;
rotationX = Mathf.Clamp(rotationX, -80f, 80f);
((Component)this).transform.rotation = Quaternion.Euler(rotationX, rotationY, 0f);
if ((Object)(object)headTransform != (Object)null)
{
headTransform.position = ((Component)this).transform.position + Vector3.up * 1.6f;
headTransform.rotation = ((Component)this).transform.rotation;
}
}
}
public class ChangeTypeWhenAwake : MonoBehaviour
{
public GameObject airstrikePrefab;
public AudioClip[] airstrikeClips;
public AirstrikeBinocular binocular;
private void OnEnable()
{
if ((Object)(object)binocular != (Object)null && (Object)(object)airstrikePrefab != (Object)null)
{
binocular.SetAirstrikeType(airstrikePrefab, airstrikeClips);
}
}
}
}
public class ScopeScript : MonoBehaviour
{
[SerializeField]
[Range(0f, 1f)]
private float zoom;
[SerializeField]
private float minFOV;
[SerializeField]
private float maxFOV;
[SerializeField]
private Camera myCamera;
[SerializeField]
private Transform myCrossHair;
[SerializeField]
private float minCrossHairScale;
[SerializeField]
private float maxCrossHairScale;
[SerializeField]
private Material imageMat;
[SerializeField]
private float minDistortion;
[SerializeField]
private float maxDistortion;
private void Start()
{
}
private void Update()
{
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
myCamera.fieldOfView = Mathf.Lerp(maxFOV, minFOV, zoom);
float num = Mathf.Lerp(minCrossHairScale, maxCrossHairScale, zoom);
myCrossHair.localScale = new Vector3(num, num, 1f);
imageMat.SetFloat("_Constant", Mathf.Lerp(minDistortion, maxDistortion, zoom));
}
}
namespace theWNbotMods
{
public class scopeFocusScript : MonoBehaviour
{
[Header("眼睛位置(VR Head 或 Debug Head)")]
[SerializeField]
private Transform eye;
[Header("瞄具参考点(通常是镜片中心)")]
[SerializeField]
private Transform eyeDistPos;
[Header("聚焦参数")]
[SerializeField]
private float fadedDist = 0.2f;
[SerializeField]
private float maxAngle = 15f;
[Header("材质控制")]
[SerializeField]
private Material focusMat;
[SerializeField]
private float minMult = 0f;
[SerializeField]
private float maxMult = 1f;
private Vector2 posInput;
private float circleCenterMovement;
private void LateUpdate()
{
//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_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
//IL_008d: 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_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: 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_00e8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)eye == (Object)null) && !((Object)(object)eyeDistPos == (Object)null) && !((Object)(object)focusMat == (Object)null))
{
float num = Vector3.Distance(eyeDistPos.position, eye.position);
float num2 = num / fadedDist;
num2 = Mathf.Clamp(num2, minMult, maxMult);
Vector3 val = ((Component)this).transform.position - eye.position;
float num3 = Vector3.Angle(val, ((Component)this).transform.forward);
circleCenterMovement = num3 / maxAngle;
Vector3 val2 = ((Component)this).transform.InverseTransformDirection(val);
Vector2 val3 = default(Vector2);
((Vector2)(ref val3))..ctor(val2.x, val2.y);
posInput = ((Vector2)(ref val3)).normalized * circleCenterMovement / 2f;
focusMat.SetFloat("_Mult", num2);
focusMat.SetFloat("_XPos", 0.5f + posInput.x);
focusMat.SetFloat("_YPos", 0.5f + posInput.y);
}
}
}
}
[HelpURL("https://geom.io/bakery/wiki/index.php?title=Manual#Bakery_Light_Filter")]
[DisallowMultipleComponent]
public class BakeryLightFilter : MonoBehaviour
{
public Texture2D texture;
[HideInInspector]
public int lmid = 0;
}
namespace theWNbotMods
{
public class CQCFists : MonoBehaviour
{
[Header("CQC Settings")]
public float GrabRange = 1f;
public float FollowStrength = 10f;
public float ThrowForce = 10f;
public float DownSwingThreshold = 1.2f;
public float ReleaseDistance = 0.8f;
[Header("Audio Settings")]
public AudioClip CQC_GrabSFX;
public AudioClip CQC_ThrowSFX;
[Header("Effect Durations")]
public float HostageConfuseDuration = 999f;
public float UnconsciousDuration = 5f;
private FVRViveHand hand;
private bool isGrabbing = false;
private bool readyToThrow = false;
private SosigLink grabbedLink = null;
private Vector3 grabOffset;
private Vector3 initialGrabPos;
private void Update()
{
if (!((Component)this).gameObject.activeSelf)
{
return;
}
hand = FindHand();
if (!((Object)(object)hand == (Object)null))
{
float triggerFloat = hand.Input.TriggerFloat;
if (triggerFloat > 0.75f && !isGrabbing)
{
TryGrabNearestLink();
}
if (isGrabbing && (Object)(object)grabbedLink != (Object)null)
{
FollowHandMovement();
DetectDownSwing();
DetectPullRelease();
}
if (isGrabbing && triggerFloat <= 0.75f)
{
PerformThrow();
}
}
}
private FVRViveHand FindHand()
{
if ((Object)(object)((Component)this).transform.parent == (Object)(object)((Component)GM.CurrentPlayerBody.LeftHand).transform)
{
return GM.CurrentMovementManager.Hands[0];
}
if ((Object)(object)((Component)this).transform.parent == (Object)(object)((Component)GM.CurrentPlayerBody.RightHand).transform)
{
return GM.CurrentMovementManager.Hands[1];
}
return null;
}
private void TryGrabNearestLink()
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
//IL_014c: Unknown result type (might be due to invalid IL or missing references)
//IL_0129: Unknown result type (might be due to invalid IL or missing references)
SosigLink[] array = Object.FindObjectsOfType<SosigLink>();
float num = float.PositiveInfinity;
SosigLink val = null;
SosigLink[] array2 = array;
foreach (SosigLink val2 in array2)
{
float num2 = Vector3.Distance(((Component)val2).transform.position, ((Component)this).transform.position);
if (num2 < GrabRange && num2 < num)
{
num = num2;
val = val2;
}
}
if (!((Object)(object)val != (Object)null))
{
return;
}
grabbedLink = val;
isGrabbing = true;
grabOffset = ((Component)grabbedLink).transform.position - ((Component)this).transform.position;
initialGrabPos = ((Component)grabbedLink).transform.position;
Sosig s = val.S;
if ((Object)(object)s != (Object)null)
{
s.m_isConfused = true;
s.m_confusedTime = HostageConfuseDuration;
s.SetBodyPose((SosigBodyPose)0);
s.ObjectUsageFocus = (SosigObjectUsageFocus)0;
if ((Object)(object)s.Agent != (Object)null)
{
((Behaviour)s.Agent).enabled = false;
}
s.SetCurrentOrder((SosigOrder)0);
s.FallbackOrder = (SosigOrder)0;
}
if ((Object)(object)CQC_GrabSFX != (Object)null)
{
AudioSource.PlayClipAtPoint(CQC_GrabSFX, ((Component)val).transform.position);
}
}
private void FollowHandMovement()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_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_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = ((Component)this).transform.position + grabOffset;
((Component)grabbedLink).transform.position = Vector3.Lerp(((Component)grabbedLink).transform.position, val, Time.deltaTime * FollowStrength);
}
private void DetectDownSwing()
{
//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)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
Vector3 throwLinearVelWorld = hand.GetThrowLinearVelWorld();
if (Vector3.Dot(((Vector3)(ref throwLinearVelWorld)).normalized, Vector3.down) > 0.6f && ((Vector3)(ref throwLinearVelWorld)).magnitude > DownSwingThreshold)
{
readyToThrow = true;
}
}
private void DetectPullRelease()
{
//IL_000c: 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_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: 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)
float num = Vector3.Distance(((Component)grabbedLink).transform.position, ((Component)this).transform.position);
if (!(num > ReleaseDistance))
{
return;
}
Vector3 val = ((Component)grabbedLink).transform.position - initialGrabPos;
Vector3 normalized = ((Vector3)(ref val)).normalized;
Sosig s = grabbedLink.S;
if ((Object)(object)s != (Object)null && (Object)(object)s.CoreRB != (Object)null)
{
s.CoreRB.AddForce(normalized * ThrowForce, (ForceMode)2);
s.KnockUnconscious(UnconsciousDuration);
if ((Object)(object)CQC_ThrowSFX != (Object)null)
{
AudioSource.PlayClipAtPoint(CQC_ThrowSFX, ((Component)s).transform.position);
}
}
ResetCQC();
}
private void PerformThrow()
{
//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)
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: 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)
if (!readyToThrow || (Object)(object)grabbedLink == (Object)null)
{
ResetCQC();
return;
}
Sosig s = grabbedLink.S;
if ((Object)(object)s == (Object)null)
{
ResetCQC();
return;
}
Vector3 throwLinearVelWorld = hand.GetThrowLinearVelWorld();
Vector3 normalized = ((Vector3)(ref throwLinearVelWorld)).normalized;
if ((Object)(object)s.CoreRB != (Object)null)
{
s.CoreRB.AddForce(normalized * ThrowForce, (ForceMode)2);
}
s.KnockUnconscious(UnconsciousDuration);
if ((Object)(object)CQC_ThrowSFX != (Object)null)
{
AudioSource.PlayClipAtPoint(CQC_ThrowSFX, ((Component)s).transform.position);
}
ResetCQC();
}
private void ResetCQC()
{
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
isGrabbing = false;
readyToThrow = false;
if ((Object)(object)grabbedLink != (Object)null && (Object)(object)grabbedLink.S != (Object)null)
{
Sosig s = grabbedLink.S;
s.m_isConfused = false;
s.ObjectUsageFocus = (SosigObjectUsageFocus)1;
if ((Object)(object)s.Agent != (Object)null)
{
((Behaviour)s.Agent).enabled = true;
}
s.SetCurrentOrder((SosigOrder)9);
s.FallbackOrder = (SosigOrder)9;
}
grabbedLink = null;
}
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)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(((Component)this).transform.position, GrabRange);
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(((Component)this).transform.position, ReleaseDistance);
}
}
public class CQCFistsSystem : MonoBehaviour
{
[Header("Prefabs")]
public GameObject CQCHandLeftPrefab;
public GameObject CQCHandRightPrefab;
private GameObject leftHandObj;
private GameObject rightHandObj;
private void Update()
{
if ((Object)(object)GM.CurrentPlayerBody == (Object)null)
{
return;
}
if ((Object)(object)GM.CurrentMovementManager.Hands[0].m_currentInteractable == (Object)null && GM.CurrentMovementManager.Hands[0].Input.TriggerPressed)
{
if ((Object)(object)leftHandObj == (Object)null)
{
leftHandObj = Object.Instantiate<GameObject>(CQCHandLeftPrefab, ((Component)GM.CurrentPlayerBody.LeftHand).transform);
}
leftHandObj.SetActive(true);
}
else if ((Object)(object)leftHandObj != (Object)null)
{
leftHandObj.SetActive(false);
}
if ((Object)(object)GM.CurrentMovementManager.Hands[1].m_currentInteractable == (Object)null && GM.CurrentMovementManager.Hands[1].Input.TriggerPressed)
{
if ((Object)(object)rightHandObj == (Object)null)
{
rightHandObj = Object.Instantiate<GameObject>(CQCHandRightPrefab, ((Component)GM.CurrentPlayerBody.RightHand).transform);
}
rightHandObj.SetActive(true);
}
else if ((Object)(object)rightHandObj != (Object)null)
{
rightHandObj.SetActive(false);
}
}
private void OnDestroy()
{
if ((Object)(object)leftHandObj != (Object)null)
{
Object.Destroy((Object)(object)leftHandObj);
}
if ((Object)(object)rightHandObj != (Object)null)
{
Object.Destroy((Object)(object)rightHandObj);
}
}
}
[BepInProcess("h3vr.exe")]
[BepInPlugin("theWNbotMods.CQCFistsToggle", "CQCFistsToggle", "1.0.0")]
public class CQCFistsToggle : BaseUnityPlugin
{
private static class CQCFistsPatch
{
[HarmonyPatch(typeof(FVRWristMenu2), "Awake")]
[HarmonyPostfix]
public static void MenuButton(FVRWristMenu2 __instance)
{
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Expected O, but got Unknown
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: Expected O, but got Unknown
if ((Object)(object)__instance == (Object)null)
{
Logger.LogMessage((object)"No FVRWristMenu2");
return;
}
bool flag = false;
foreach (WristMenuButton button in WristMenuAPI.Buttons)
{
if (button.Text == "CQCFistsToggle")
{
flag = true;
break;
}
}
if (!flag)
{
WristMenuAPI.Buttons.Add(new WristMenuButton("CQCFistsToggle", new ButtonClickEvent(ToggleCQCFistsSystem)));
Logger.LogMessage((object)"CQCFistsToggle button added to wrist menu!");
}
}
public static void ToggleCQCFistsSystem(object sender, ButtonClickEventArgs args)
{
GameObject val = GameObject.Find("CQCFistsSystem(Clone)");
if ((Object)(object)val != (Object)null)
{
Logger.LogMessage((object)"CQCFistsSystem found, destroying...");
Object.Destroy((Object)(object)val);
return;
}
Logger.LogMessage((object)"Spawning CQCFistsSystem from Inspector reference...");
CQCFistsToggle component = Chainloader.ManagerObject.GetComponent<CQCFistsToggle>();
if ((Object)(object)component != (Object)null && (Object)(object)component.CQCFistsSystemPrefab != (Object)null)
{
GameObject val2 = Object.Instantiate<GameObject>(component.CQCFistsSystemPrefab);
Object.DontDestroyOnLoad((Object)(object)val2);
((Object)val2).name = "CQCFistsSystem(Clone)";
}
else
{
Logger.LogMessage((object)"CQCFistsSystem Prefab not assigned in Inspector!");
}
}
}
public GameObject CQCFistsSystemPrefab;
internal static ManualLogSource Logger { get; private set; }
public void Awake()
{
Logger = ((BaseUnityPlugin)this).Logger;
Harmony.CreateAndPatchAll(typeof(CQCFistsPatch), (string)null);
Logger.LogMessage((object)"CQCFistsToggle loaded!");
}
}
public class CQCMelee : MonoBehaviour
{
[Header("CQC Settings")]
public float GrabRange = 1f;
public float FollowStrength = 10f;
public float ThrowForce = 10f;
public float DownSwingThreshold = 1.2f;
public float ReleaseDistance = 0.8f;
[Header("Audio Settings")]
public AudioClip CQC_GrabSFX;
public AudioClip CQC_ThrowSFX;
[Header("Effect Durations")]
public float HostageConfuseDuration = 999f;
public float UnconsciousDuration = 5f;
[Header("Disable Prefabs on Grab")]
public GameObject[] disableOnGrab;
private FVRMeleeWeapon weapon;
private FVRViveHand hand;
private bool isGrabbing = false;
private bool readyToThrow = false;
private SosigLink grabbedLink = null;
private Vector3 grabOffset;
private Vector3 initialGrabPos;
private void Start()
{
weapon = ((Component)this).GetComponent<FVRMeleeWeapon>();
}
private void Update()
{
if ((Object)(object)weapon == (Object)null || !((FVRInteractiveObject)weapon).IsHeld)
{
return;
}
hand = ((FVRInteractiveObject)weapon).m_hand;
if (!((Object)(object)hand == (Object)null))
{
float triggerFloat = hand.Input.TriggerFloat;
if (triggerFloat > 0.75f && !isGrabbing)
{
TryGrabNearestLink();
}
if (isGrabbing && (Object)(object)grabbedLink != (Object)null)
{
FollowWeaponMovement();
DetectDownSwing();
DetectPullRelease();
}
if (isGrabbing && triggerFloat <= 0.75f)
{
PerformThrow();
}
}
}
private void TryGrabNearestLink()
{
//IL_0028: 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_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: 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_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)
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_0104: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: 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)
SosigLink[] array = Object.FindObjectsOfType<SosigLink>();
float num = float.PositiveInfinity;
SosigLink val = null;
SosigLink[] array2 = array;
foreach (SosigLink val2 in array2)
{
float num2 = Vector3.Distance(((Component)val2).transform.position, ((Component)weapon).transform.position);
if (num2 < GrabRange && num2 < num)
{
num = num2;
val = val2;
}
}
if (!((Object)(object)val != (Object)null))
{
return;
}
grabbedLink = val;
isGrabbing = true;
grabOffset = ((Component)grabbedLink).transform.position - ((Component)weapon).transform.position;
initialGrabPos = ((Component)grabbedLink).transform.position;
Sosig s = val.S;
if ((Object)(object)s != (Object)null)
{
s.m_isConfused = true;
s.m_confusedTime = HostageConfuseDuration;
s.SetBodyPose((SosigBodyPose)0);
s.ObjectUsageFocus = (SosigObjectUsageFocus)0;
if ((Object)(object)s.Agent != (Object)null)
{
((Behaviour)s.Agent).enabled = false;
}
s.SetCurrentOrder((SosigOrder)0);
s.FallbackOrder = (SosigOrder)0;
}
if ((Object)(object)CQC_GrabSFX != (Object)null)
{
AudioSource.PlayClipAtPoint(CQC_GrabSFX, ((Component)val).transform.position);
}
if (disableOnGrab == null)
{
return;
}
GameObject[] array3 = disableOnGrab;
foreach (GameObject val3 in array3)
{
if ((Object)(object)val3 != (Object)null)
{
val3.SetActive(false);
}
}
}
private void FollowWeaponMovement()
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_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)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = ((Component)weapon).transform.position + grabOffset;
((Component)grabbedLink).transform.position = Vector3.Lerp(((Component)grabbedLink).transform.position, val, Time.deltaTime * FollowStrength);
}
private void DetectDownSwing()
{
//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)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
Vector3 throwLinearVelWorld = hand.GetThrowLinearVelWorld();
if (Vector3.Dot(((Vector3)(ref throwLinearVelWorld)).normalized, Vector3.down) > 0.6f && ((Vector3)(ref throwLinearVelWorld)).magnitude > DownSwingThreshold)
{
readyToThrow = true;
}
}
private void DetectPullRelease()
{
//IL_000c: 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)
//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)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_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_0088: 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_00c3: Unknown result type (might be due to invalid IL or missing references)
float num = Vector3.Distance(((Component)grabbedLink).transform.position, ((Component)weapon).transform.position);
if (!(num > ReleaseDistance))
{
return;
}
Vector3 val = ((Component)grabbedLink).transform.position - initialGrabPos;
Vector3 normalized = ((Vector3)(ref val)).normalized;
Sosig s = grabbedLink.S;
if ((Object)(object)s != (Object)null && (Object)(object)s.CoreRB != (Object)null)
{
s.CoreRB.AddForce(normalized * ThrowForce, (ForceMode)2);
s.KnockUnconscious(UnconsciousDuration);
if ((Object)(object)CQC_ThrowSFX != (Object)null)
{
AudioSource.PlayClipAtPoint(CQC_ThrowSFX, ((Component)s).transform.position);
}
}
ResetCQC();
}
private void PerformThrow()
{
//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)
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: 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)
if (!readyToThrow || (Object)(object)grabbedLink == (Object)null)
{
ResetCQC();
return;
}
Sosig s = grabbedLink.S;
if ((Object)(object)s == (Object)null)
{
ResetCQC();
return;
}
Vector3 throwLinearVelWorld = hand.GetThrowLinearVelWorld();
Vector3 normalized = ((Vector3)(ref throwLinearVelWorld)).normalized;
if ((Object)(object)s.CoreRB != (Object)null)
{
s.CoreRB.AddForce(normalized * ThrowForce, (ForceMode)2);
}
s.KnockUnconscious(UnconsciousDuration);
if ((Object)(object)CQC_ThrowSFX != (Object)null)
{
AudioSource.PlayClipAtPoint(CQC_ThrowSFX, ((Component)s).transform.position);
}
ResetCQC();
}
private void ResetCQC()
{
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
isGrabbing = false;
readyToThrow = false;
if ((Object)(object)grabbedLink != (Object)null && (Object)(object)grabbedLink.S != (Object)null)
{
Sosig s = grabbedLink.S;
s.m_isConfused = false;
s.ObjectUsageFocus = (SosigObjectUsageFocus)1;
if ((Object)(object)s.Agent != (Object)null)
{
((Behaviour)s.Agent).enabled = true;
}
s.SetCurrentOrder((SosigOrder)9);
s.FallbackOrder = (SosigOrder)9;
}
grabbedLink = null;
if (disableOnGrab == null)
{
return;
}
GameObject[] array = disableOnGrab;
foreach (GameObject val in array)
{
if ((Object)(object)val != (Object)null)
{
val.SetActive(true);
}
}
}
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)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(((Component)this).transform.position, GrabRange);
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(((Component)this).transform.position, ReleaseDistance);
}
}
public class CigaretteAttach : MonoBehaviour
{
[Header("Attach Settings")]
public float attachDistance = 0.2f;
public Vector3 positionOffset = new Vector3(0f, -0.05f, 0.05f);
public Vector3 rotationOffsetEuler = new Vector3(0f, 0f, 0f);
[Header("Smoke Settings")]
public GameObject PuffedSmokePrefab;
public float puffDelay = 3f;
public float puffCooldown = 2f;
public Vector3 smokeOffset = new Vector3(0f, -0.1f, 0.1f);
[Header("References")]
public FVRCigarette cigarette;
[Header("Attach Prefab Control")]
public GameObject[] enableOnAttach;
public GameObject[] disableOnAttach;
[Header("Detach Prefab Control")]
public GameObject[] enableOnDetach;
public GameObject[] disableOnDetach;
private bool isAttachedToHead = false;
private Transform headTransform;
private FVRPhysicalObject fvrObject;
private Rigidbody rb;
private float puffTimer = 0f;
private bool inCooldown = false;
private void Awake()
{
if ((Object)(object)GM.CurrentPlayerBody != (Object)null && (Object)(object)GM.CurrentPlayerBody.Head != (Object)null)
{
headTransform = GM.CurrentPlayerBody.Head;
}
fvrObject = ((Component)this).GetComponent<FVRPhysicalObject>();
rb = ((Component)this).GetComponent<Rigidbody>();
}
private void Update()
{
//IL_0029: 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)
if ((Object)(object)headTransform == (Object)null)
{
return;
}
if (!isAttachedToHead)
{
float num = Vector3.Distance(((Component)this).transform.position, headTransform.position);
if (num <= attachDistance)
{
AttachToHead();
}
}
if (isAttachedToHead)
{
if ((Object)(object)fvrObject != (Object)null && ((FVRInteractiveObject)fvrObject).m_isHeld)
{
DetachFromHead();
}
else
{
HandleSmokeLogic();
}
}
}
private void AttachToHead()
{
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
isAttachedToHead = true;
((Component)this).transform.SetParent(headTransform);
((Component)this).transform.localPosition = positionOffset;
((Component)this).transform.localRotation = Quaternion.Euler(rotationOffsetEuler);
if ((Object)(object)rb != (Object)null)
{
rb.isKinematic = true;
rb.useGravity = false;
}
puffTimer = 0f;
inCooldown = false;
GameObject[] array = enableOnAttach;
foreach (GameObject val in array)
{
if ((Object)(object)val != (Object)null)
{
val.SetActive(true);
}
}
GameObject[] array2 = disableOnAttach;
foreach (GameObject val2 in array2)
{
if ((Object)(object)val2 != (Object)null)
{
val2.SetActive(false);
}
}
}
private void DetachFromHead()
{
isAttachedToHead = false;
((Component)this).transform.SetParent((Transform)null);
if ((Object)(object)rb != (Object)null)
{
rb.isKinematic = false;
rb.useGravity = true;
}
puffTimer = 0f;
inCooldown = false;
GameObject[] array = enableOnDetach;
foreach (GameObject val in array)
{
if ((Object)(object)val != (Object)null)
{
val.SetActive(true);
}
}
GameObject[] array2 = disableOnDetach;
foreach (GameObject val2 in array2)
{
if ((Object)(object)val2 != (Object)null)
{
val2.SetActive(false);
}
}
}
private void HandleSmokeLogic()
{
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)cigarette == (Object)null || !cigarette.IsBurning())
{
return;
}
puffTimer += Time.deltaTime;
if (!inCooldown && puffTimer >= puffDelay)
{
if ((Object)(object)PuffedSmokePrefab != (Object)null)
{
Vector3 val = headTransform.position + headTransform.TransformVector(smokeOffset);
Object.Instantiate<GameObject>(PuffedSmokePrefab, val, headTransform.rotation);
}
inCooldown = true;
puffTimer = 0f;
}
else if (inCooldown && puffTimer >= puffCooldown)
{
inCooldown = false;
puffTimer = 0f;
}
}
}
public class CigaretteBox : FVRPhysicalObject
{
private bool triggerPressedLastFrame = false;
private bool isOpen = false;
private bool isTouching = false;
private Vector2 initTouch = Vector2.zero;
private Vector2 LastTouchPoint = Vector2.zero;
public Transform CaseLid;
public float openRotationX = 90f;
public float openRotationY = 0f;
public float openRotationZ = 0f;
public float closeRotationX = 0f;
public float closeRotationY = 0f;
public float closeRotationZ = 0f;
public float rotationSpeed = 5f;
public AudioSource audioSource;
public AudioClip openSound;
public AudioClip closeSound;
public GameObject objectToToggle;
public List<Transform> Dings;
public int m_numDings;
public CigaretteBoxTrigger cigaretteBoxTrigger;
private Quaternion targetRotation;
public override void Start()
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
CaseLid.localRotation = Quaternion.Euler(closeRotationX, closeRotationY, closeRotationZ);
targetRotation = CaseLid.localRotation;
}
private void Update()
{
//IL_000d: 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_0024: Unknown result type (might be due to invalid IL or missing references)
CaseLid.localRotation = Quaternion.Lerp(CaseLid.localRotation, targetRotation, Time.deltaTime * rotationSpeed);
}
public override void UpdateInteraction(FVRViveHand hand)
{
//IL_016b: Unknown result type (might be due to invalid IL or missing references)
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: 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_0119: 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_011f: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
//IL_0153: Unknown result type (might be due to invalid IL or missing references)
//IL_0158: Unknown result type (might be due to invalid IL or missing references)
//IL_015d: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
((FVRPhysicalObject)this).UpdateInteraction(hand);
if (hand.Input.TriggerFloat > 0.8f && !triggerPressedLastFrame && (Object)(object)hand.CurrentInteractable == (Object)(object)this)
{
ToggleLid();
triggerPressedLastFrame = true;
}
else if (hand.Input.TriggerFloat < 0.2f)
{
triggerPressedLastFrame = false;
}
if (hand.IsInStreamlinedMode)
{
if (hand.Input.BYButtonDown || hand.Input.AXButtonDown)
{
ToggleLid();
}
return;
}
if (hand.Input.TouchpadTouched && !isTouching && hand.Input.TouchpadAxes != Vector2.zero)
{
isTouching = true;
initTouch = hand.Input.TouchpadAxes;
}
if (hand.Input.TouchpadTouchUp && isTouching)
{
isTouching = false;
Vector2 lastTouchPoint = LastTouchPoint;
float y = (lastTouchPoint - initTouch).y;
if (y > 0.5f || y < -0.5f)
{
ToggleLid();
}
initTouch = Vector2.zero;
lastTouchPoint = Vector2.zero;
}
LastTouchPoint = hand.Input.TouchpadAxes;
}
private void ToggleLid()
{
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
isOpen = !isOpen;
targetRotation = (isOpen ? Quaternion.Euler(openRotationX, openRotationY, openRotationZ) : Quaternion.Euler(closeRotationX, closeRotationY, closeRotationZ));
if (isOpen)
{
if ((Object)(object)audioSource != (Object)null && (Object)(object)openSound != (Object)null)
{
audioSource.PlayOneShot(openSound);
}
if ((Object)(object)objectToToggle != (Object)null)
{
objectToToggle.SetActive(true);
}
Open();
}
else
{
if ((Object)(object)audioSource != (Object)null && (Object)(object)closeSound != (Object)null)
{
audioSource.PlayOneShot(closeSound);
}
if ((Object)(object)objectToToggle != (Object)null)
{
objectToToggle.SetActive(false);
}
Close();
}
}
public bool IsOpen()
{
return isOpen;
}
public bool HasADing()
{
return m_numDings > 0;
}
public override void FVRUpdate()
{
((FVRPhysicalObject)this).FVRUpdate();
}
public void Open()
{
isOpen = true;
if ((Object)(object)audioSource != (Object)null && (Object)(object)openSound != (Object)null)
{
audioSource.PlayOneShot(openSound);
}
UpdateDingDisplay();
}
public void Close()
{
isOpen = false;
if ((Object)(object)audioSource != (Object)null && (Object)(object)closeSound != (Object)null)
{
audioSource.PlayOneShot(closeSound);
}
UpdateDingDisplay();
}
public void RemoveDing()
{
if (m_numDings > 0)
{
m_numDings--;
UpdateDingDisplay();
}
}
private void UpdateDingDisplay()
{
for (int i = 0; i < Dings.Count; i++)
{
if (i < m_numDings)
{
((Component)Dings[i]).gameObject.SetActive(true);
}
else
{
((Component)Dings[i]).gameObject.SetActive(false);
}
}
}
}
}
public class CigaretteBoxTrigger : FVRInteractiveObject
{
public CigaretteBox cigaretteBox;
public GameObject cigarPrefab;
public override bool IsInteractable()
{
return cigaretteBox.HasADing() && ((FVRInteractiveObject)this).IsInteractable();
}
public override void BeginInteraction(FVRViveHand hand)
{
((FVRInteractiveObject)this).SimpleInteraction(hand);
}
public override void SimpleInteraction(FVRViveHand hand)
{
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
((FVRInteractiveObject)this).SimpleInteraction(hand);
if (cigaretteBox.IsOpen())
{
cigaretteBox.RemoveDing();
GameObject val = Object.Instantiate<GameObject>(cigarPrefab, ((HandInput)(ref hand.Input)).Pos, ((HandInput)(ref hand.Input)).Rot);
FVRPhysicalObject component = val.GetComponent<FVRPhysicalObject>();
hand.ForceSetInteractable((FVRInteractiveObject)(object)component);
((FVRInteractiveObject)component).BeginInteraction(hand);
}
else
{
cigaretteBox.Open();
}
}
}
namespace theWNbotMods
{
[Serializable]
public class MotionPart
{
public GameObject motionPrefab;
public GameObject startPrefab;
public GameObject endPrefab;
}
public class FVRCigarette : QBArmorHelmet
{
[Header("Visual Prefabs")]
public GameObject Unlit;
public GameObject Lit;
[Header("Motion Parts")]
public MotionPart[] motionParts;
[Header("Animation Settings")]
public float burnAnimDuration = 10f;
private float burnAnimTimer = 0f;
private bool animPlaying = false;
[Header("Burn Settings")]
public float BurnDuration = 120f;
public float DestructionDelay = 10f;
private bool m_isBurning = false;
private bool m_hasBeenLit = false;
private float m_burnTimer;
[Header("Fire Prefabs Control")]
public GameObject[] fireOnPrefabs;
public GameObject[] fireOffPrefabs;
[Header("Torch Prefab Control")]
public GameObject torchPrefab;
[Header("Extinguish Collider")]
public Collider ExtinguishCollider;
[Header("Extinguish Settings")]
public LayerMask ExtinguishLayers;
[Header("Audio Settings")]
public AudioSource audioSource;
public AudioClip extinguishSound;
public override void Awake()
{
((QBArmorHelmet)this).Awake();
if ((Object)(object)Unlit != (Object)null)
{
Unlit.SetActive(true);
}
if ((Object)(object)Lit != (Object)null)
{
Lit.SetActive(false);
}
if (motionParts == null)
{
return;
}
MotionPart[] array = motionParts;
foreach (MotionPart motionPart in array)
{
if ((Object)(object)motionPart.motionPrefab != (Object)null)
{
motionPart.motionPrefab.SetActive(false);
}
}
}
public override void FVRUpdate()
{
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: 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_00fa: Unknown result type (might be due to invalid IL or missing references)
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
//IL_0136: Unknown result type (might be due to invalid IL or missing references)
((QBArmorPiece)this).FVRUpdate();
if (!m_isBurning)
{
return;
}
m_burnTimer -= Time.deltaTime;
if (animPlaying)
{
burnAnimTimer += Time.deltaTime;
float num = Mathf.Clamp01(burnAnimTimer / burnAnimDuration);
MotionPart[] array = motionParts;
foreach (MotionPart motionPart in array)
{
if ((Object)(object)motionPart.motionPrefab != (Object)null && (Object)(object)motionPart.startPrefab != (Object)null && (Object)(object)motionPart.endPrefab != (Object)null)
{
motionPart.motionPrefab.transform.position = Vector3.Lerp(motionPart.startPrefab.transform.position, motionPart.endPrefab.transform.position, num);
motionPart.motionPrefab.transform.rotation = Quaternion.Lerp(motionPart.startPrefab.transform.rotation, motionPart.endPrefab.transform.rotation, num);
motionPart.motionPrefab.transform.localScale = Vector3.Lerp(motionPart.startPrefab.transform.localScale, motionPart.endPrefab.transform.localScale, num);
}
}
if (num >= 1f)
{
animPlaying = false;
}
}
if (m_burnTimer <= 0f)
{
StopBurning();
}
}
public void Ignite()
{
if (m_isBurning)
{
return;
}
m_hasBeenLit = true;
m_isBurning = true;
if (m_burnTimer <= 0f)
{
m_burnTimer = BurnDuration;
}
if ((Object)(object)Unlit != (Object)null)
{
Unlit.SetActive(false);
}
if ((Object)(object)Lit != (Object)null)
{
Lit.SetActive(true);
}
animPlaying = true;
if (motionParts != null)
{
MotionPart[] array = motionParts;
foreach (MotionPart motionPart in array)
{
if ((Object)(object)motionPart.motionPrefab != (Object)null && (Object)(object)motionPart.startPrefab != (Object)null)
{
motionPart.motionPrefab.SetActive(true);
}
}
}
GameObject[] array2 = fireOnPrefabs;
foreach (GameObject val in array2)
{
if ((Object)(object)val != (Object)null)
{
val.SetActive(true);
}
}
if ((Object)(object)torchPrefab != (Object)null)
{
torchPrefab.SetActive(false);
}
}
private void Extinguish()
{
if (!m_isBurning)
{
return;
}
m_isBurning = false;
animPlaying = false;
if ((Object)(object)Lit != (Object)null)
{
Lit.SetActive(true);
}
if ((Object)(object)Unlit != (Object)null)
{
Unlit.SetActive(false);
}
GameObject[] array = fireOffPrefabs;
foreach (GameObject val in array)
{
if ((Object)(object)val != (Object)null)
{
val.SetActive(false);
}
}
if ((Object)(object)torchPrefab != (Object)null)
{
torchPrefab.SetActive(true);
}
if ((Object)(object)audioSource != (Object)null && (Object)(object)extinguishSound != (Object)null)
{
audioSource.PlayOneShot(extinguishSound);
}
}
private void StopBurning()
{
m_isBurning = false;
animPlaying = false;
if (motionParts == null)
{
return;
}
MotionPart[] array = motionParts;
foreach (MotionPart motionPart in array)
{
if ((Object)(object)motionPart.motionPrefab != (Object)null)
{
motionPart.motionPrefab.SetActive(false);
}
}
}
private void OnCollisionEnter(Collision collision)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)ExtinguishCollider == (Object)null)
{
return;
}
ContactPoint[] contacts = collision.contacts;
for (int i = 0; i < contacts.Length; i++)
{
ContactPoint val = contacts[i];
if ((Object)(object)((ContactPoint)(ref val)).thisCollider == (Object)(object)ExtinguishCollider && ((1 << ((Component)collision.collider).gameObject.layer) & LayerMask.op_Implicit(ExtinguishLayers)) != 0)
{
Extinguish();
break;
}
}
}
public bool IsBurning()
{
return m_isBurning;
}
}
public class TorchCigaretteTrigger : MonoBehaviour
{
[Header("Cigarette Reference")]
public FVRCigarette Cigarette;
[Header("Torch Prefab")]
public GameObject torchPrefab;
private void OnTriggerEnter(Collider col)
{
if ((Object)(object)Cigarette != (Object)null)
{
Cigarette.Ignite();
if ((Object)(object)torchPrefab != (Object)null)
{
torchPrefab.SetActive(false);
}
}
}
}
}
namespace FNAFModeScripts
{
public class ChancetoNextStage : MonoBehaviour
{
[Serializable]
public class StageData
{
[Header("每隔多少秒进行一次概率判定")]
public float rollInterval = 5f;
[Header("进入下一阶段的概率(0~1)")]
[Range(0f, 1f)]
public float chanceToAdvance = 0.2f;
[Header("如果超过多少秒还没进入下一阶段 → 强制进入")]
public float forceAdvanceTime = 20f;
[Header("进入此阶段时激活的 Prefab")]
public GameObject[] activatePrefabs;
}
[Header("阶段列表(按顺序执行)")]
public StageData[] stages;
[Header("Awake 时自动启动")]
public bool autoStart = true;
[Header("是否一次性只显示当前阶段的 Prefab")]
public bool onlyShowCurrentStage = false;
private int currentStage = 0;
private void Awake()
{
if (autoStart)
{
StartStages();
}
}
public void StartStages()
{
currentStage = 0;
((MonoBehaviour)this).StartCoroutine(RunStages());
}
private IEnumerator RunStages()
{
while (currentStage < stages.Length)
{
StageData stage = stages[currentStage];
if (onlyShowCurrentStage)
{
HideAllPrefabs();
}
ActivatePrefabs(stage.activatePrefabs);
float elapsed = 0f;
while (true)
{
if (elapsed < stage.forceAdvanceTime)
{
yield return (object)new WaitForSeconds(stage.rollInterval);
elapsed += stage.rollInterval;
float roll = Random.value;
if (roll <= stage.chanceToAdvance)
{
currentStage++;
break;
}
continue;
}
currentStage++;
break;
}
yield return null;
}
}
private void ActivatePrefabs(GameObject[] prefabs)
{
if (prefabs == null)
{
return;
}
foreach (GameObject val in prefabs)
{
if ((Object)(object)val != (Object)null)
{
val.SetActive(true);
}
}
}
private void HideAllPrefabs()
{
StageData[] array = stages;
foreach (StageData stageData in array)
{
if (stageData.activatePrefabs == null)
{
continue;
}
GameObject[] activatePrefabs = stageData.activatePrefabs;
foreach (GameObject val in activatePrefabs)
{
if ((Object)(object)val != (Object)null)
{
val.SetActive(false);
}
}
}
}
}
}
namespace theWNbotMods
{
public class DelayedActive : MonoBehaviour
{
[Header("延迟多少秒后激活 Prefab")]
public float delay = 1f;
[Header("要激活的 Prefab 列表")]
public GameObject[] prefabsToActivate;
private void OnEnable()
{
((MonoBehaviour)this).StartCoroutine(ActivateAfterDelay());
}
private IEnumerator ActivateAfterDelay()
{
if (delay > 0f)
{
yield return (object)new WaitForSeconds(delay);
}
for (int i = 0; i < prefabsToActivate.Length; i++)
{
if ((Object)(object)prefabsToActivate[i] != (Object)null)
{
prefabsToActivate[i].SetActive(true);
}
}
}
}
}
namespace FNAFModeScripts
{
public class EventDoorClose : MonoBehaviour
{
[Header("随机事件控制")]
[Range(0f, 1f)]
public float eventChance = 0.5f;
[Header("门动画(Start / End Prefab)")]
public Transform door;
public GameObject doorOpenPrefab;
public GameObject doorClosedPrefab;
public float openAnimDuration = 0.6f;
public float closeAnimDuration = 0.15f;
private Vector3 openPos;
private Quaternion openRot;
private Vector3 closedPos;
private Quaternion closedRot;
private Coroutine animCoroutine;
[Header("鬼脸(场景中隐藏物体)")]
public GameObject ghostFaceObject;
public float ghostDuration = 0.4f;
[Header("音效")]
public AudioSource audioSource;
public AudioClip doorOpenSound;
public AudioClip ghostSound;
public AudioClip doorCloseSound;
[Header("Trigger 引用")]
public Collider openTrigger;
public Collider scareTrigger;
[Header("事件控制")]
public bool oneTime = true;
private bool opened = false;
private bool scared = false;
[Header("Debug 控制")]
public bool debugOpen = false;
public bool debugScare = false;
private void Start()
{
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_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_0080: 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_0096: 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)
if (Random.value > eventChance)
{
((Component)this).gameObject.SetActive(false);
return;
}
if ((Object)(object)doorOpenPrefab != (Object)null)
{
openPos = doorOpenPrefab.transform.localPosition;
openRot = doorOpenPrefab.transform.localRotation;
}
if ((Object)(object)doorClosedPrefab != (Object)null)
{
closedPos = doorClosedPrefab.transform.localPosition;
closedRot = doorClosedPrefab.transform.localRotation;
}
if ((Object)(object)ghostFaceObject != (Object)null)
{
ghostFaceObject.SetActive(false);
}
}
private void Update()
{
if (debugOpen)
{
debugOpen = false;
((MonoBehaviour)this).StartCoroutine(OpenDoor());
}
if (debugScare)
{
debugScare = false;
((MonoBehaviour)this).StartCoroutine(ScareAndClose());
}
}
private void OnTriggerEnter(Collider other)
{
if (!((Object)(object)((Component)other).transform != (Object)(object)GM.CurrentPlayerBody.Head))
{
if ((Object)(object)other == (Object)(object)openTrigger && !opened)
{
opened = true;
((MonoBehaviour)this).StartCoroutine(OpenDoor());
}
if ((Object)(object)other == (Object)(object)scareTrigger && !scared)
{
scared = true;
((MonoBehaviour)this).StartCoroutine(ScareAndClose());
}
}
}
private IEnumerator OpenDoor()
{
if ((Object)(object)audioSource != (Object)null && (Object)(object)doorOpenSound != (Object)null)
{
audioSource.PlayOneShot(doorOpenSound);
}
yield return ((MonoBehaviour)this).StartCoroutine(AnimateDoor(openPos, openRot, openAnimDuration));
}
private IEnumerator ScareAndClose()
{
if ((Object)(object)ghostFaceObject != (Object)null)
{
ghostFaceObject.SetActive(true);
}
if ((Object)(object)audioSource != (Object)null && (Object)(object)ghostSound != (Object)null)
{
audioSource.PlayOneShot(ghostSound);
}
yield return (object)new WaitForSeconds(ghostDuration);
if ((Object)(object)ghostFaceObject != (Object)null)
{
ghostFaceObject.SetActive(false);
}
if ((Object)(object)audioSource != (Object)null && (Object)(object)doorCloseSound != (Object)null)
{
audioSource.PlayOneShot(doorCloseSound);
}
yield return ((MonoBehaviour)this).StartCoroutine(AnimateDoor(closedPos, closedRot, closeAnimDuration));
}
private IEnumerator AnimateDoor(Vector3 targetPos, Quaternion targetRot, float duration)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)door == (Object)null))
{
Vector3 startPos = door.localPosition;
Quaternion startRot = door.localRotation;
float t = 0f;
while (t < duration)
{
float lerp = t / duration;
door.localPosition = Vector3.Lerp(startPos, targetPos, lerp);
door.localRotation = Quaternion.Lerp(startRot, targetRot, lerp);
t += Time.deltaTime;
yield return null;
}
door.localPosition = targetPos;
door.localRotation = targetRot;
}
}
}
public class FNAFAnimatronicAI : MonoBehaviour
{
[Header("注释")]
[TextArea(2, 5)]
public string developerNote;
[Header("移动概率(每小时 AI Level)")]
[Range(0f, 20f)]
public int AI_12AM = 20;
[Range(0f, 20f)]
public int AI_1AM = 20;
[Range(0f, 20f)]
public int AI_2AM = 20;
[Range(0f, 20f)]
public int AI_3AM = 20;
[Range(0f, 20f)]
public int AI_4AM = 20;
[Range(0f, 20f)]
public int AI_5AM = 20;
[Header("AI Roll 时间范围 (秒)")]
public float minRollTime = 1f;
public float maxRollTime = 2f;
private float rollTimer = 0f;
private float nextRollTime = 0f;
private int currentAILevel = 0;
private FNAFWaypoint[] waypoints;
private int currentIndex = 0;
private bool aiActive = false;
private void Start()
{
waypoints = ((Component)this).GetComponentsInChildren<FNAFWaypoint>(true);
for (int i = 0; i < waypoints.Length; i++)
{
waypoints[i].index = i;
}
SetAllPosesInactive();
ActivatePose(currentIndex);
FNAFNightClock fNAFNightClock = Object.FindObjectOfType<FNAFNightClock>();
if ((Object)(object)fNAFNightClock != (Object)null)
{
fNAFNightClock.OnHourChanged = (Action<int>)Delegate.Combine(fNAFNightClock.OnHourChanged, new Action<int>(SetAILevelByHour));
}
aiActive = true;
if ((Object)(object)fNAFNightClock != (Object)null)
{
SetAILevelByHour(fNAFNightClock.currentHour);
}
else
{
SetAILevelByHour(12);
}
ScheduleNextRoll();
TryMove();
Debug.Log((object)(((Object)this).name + " AI Enable"));
}
private void Update()
{
if (aiActive)
{
rollTimer += Time.deltaTime;
if (rollTimer >= nextRollTime)
{
rollTimer = 0f;
ScheduleNextRoll();
TryMove();
}
}
}
private void ScheduleNextRoll()
{
nextRollTime = Random.Range(minRollTime, maxRollTime);
}
private void SetAllPosesInactive()
{
for (int i = 0; i < waypoints.Length; i++)
{
if ((Object)(object)waypoints[i].Pose != (Object)null)
{
waypoints[i].Pose.SetActive(false);
}
}
}
private void ActivatePose(int index)
{
if ((Object)(object)waypoints[index].Pose != (Object)null)
{
waypoints[index].Pose.SetActive(true);
}
}
private void TryMove()
{
int num = Random.Range(1, 21);
Debug.Log((object)(((Object)this).name + " Roll = " + num + " / AI Level = " + currentAILevel));
if (num < currentAILevel)
{
MoveToNextWaypoint();
}
}
private void MoveToNextWaypoint()
{
FNAFWaypoint fNAFWaypoint = waypoints[currentIndex];
if (fNAFWaypoint.nextPoints == null || fNAFWaypoint.nextPoints.Length == 0)
{
return;
}
int num = ChooseNextWaypoint(fNAFWaypoint);
FNAFWaypoint fNAFWaypoint2 = waypoints[num];
if (fNAFWaypoint2.isDoorNode && (Object)(object)fNAFWaypoint2.doorToCheck != (Object)null)
{
FNAFDoor component = fNAFWaypoint2.doorToCheck.GetComponent<FNAFDoor>();
if (fNAFWaypoint2.breakDoor && (Object)(object)component != (Object)null)
{
component.ForceDoorBroken();
Debug.Log((object)(((Object)this).name + " 把门破坏了!门无法关闭!"));
}
if ((Object)(object)component != (Object)null && component.currentState == FNAFDoor.DoorState.Closed)
{
Debug.Log((object)(((Object)this).name + " Door Closed, gets back"));
if (fNAFWaypoint2.failReturnPoints != null && fNAFWaypoint2.failReturnPoints.Length > 0)
{
int num2 = Random.Range(0, fNAFWaypoint2.failReturnPoints.Length);
num = fNAFWaypoint2.failReturnPoints[num2].index;
}
else
{
num = currentIndex;
}
}
}
waypoints[currentIndex].Pose.SetActive(false);
currentIndex = num;
waypoints[currentIndex].Pose.SetActive(true);
Debug.Log((object)(((Object)this).name + " Move to waypoint: " + currentIndex));
waypoints[currentIndex].TryPlaySound();
waypoints[currentIndex].TriggerAttack();
waypoints[currentIndex].StartForceMove();
}
private int ChooseNextWaypoint(FNAFWaypoint wp)
{
if (wp.nextPoints == null || wp.nextPoints.Length == 0)
{
return wp.index;
}
if (wp.nextPoints.Length == 1)
{
return wp.nextPoints[0].nextPoint.index;
}
int num = 0;
for (int i = 0; i < wp.nextPoints.Length; i++)
{
num += wp.nextPoints[i].chance;
}
int num2 = Random.Range(0, num);
int num3 = 0;
for (int j = 0; j < wp.nextPoints.Length; j++)
{
num3 += wp.nextPoints[j].chance;
if (num2 < num3)
{
return wp.nextPoints[j].nextPoint.index;
}
}
return wp.nextPoints[0].nextPoint.index;
}
public void ForceMoveTo(int waypointIndex)
{
waypoints[currentIndex].Pose.SetActive(false);
currentIndex = waypointIndex;
waypoints[currentIndex].Pose.SetActive(true);
Debug.Log((object)(((Object)this).name + " 强制移动到节点: " + currentIndex));
waypoints[currentIndex].TryPlaySound();
waypoints[currentIndex].TriggerAttack();
waypoints[currentIndex].StartForceMove();
}
public void DeactivateAI()
{
aiActive = false;
Debug.Log((object)(((Object)this).name + " AI Stopped"));
}
public void SetAILevelByHour(int hour)
{
switch (hour)
{
case 12:
currentAILevel = AI_12AM;
break;
case 1:
currentAILevel = AI_1AM;
break;
case 2:
currentAILevel = AI_2AM;
break;
case 3:
currentAILevel = AI_3AM;
break;
case 4:
currentAILevel = AI_4AM;
break;
case 5:
currentAILevel = AI_5AM;
break;
}
Debug.Log((object)(((Object)this).name + " AI Level to: " + currentAILevel + "(Now Time: " + hour + "AM)"));
}
}
public enum CameraSwitchInitialState
{
Off,
On
}
public class FNAFCameraButton : MonoBehaviour
{
[Header("摄像头管理器引用")]
public FNAFCameraManager cameraManager;
[Header("对应摄像头索引(从 0 开始)")]
public int cameraIndex = 0;
[Header("开关动画")]
public Transform switchHandle;
public GameObject handleStartPrefab;
public GameObject handleEndPrefab;
public float animDuration = 0.15f;
[Header("开关音效")]
public AudioSource audioSource;
public AudioClip toggleSound;
private Vector3 startPos;
private Vector3 endPos;
private Quaternion startRot;
private Quaternion endRot;
private Coroutine animCoroutine;
private AR15HandleSightFlipper flipper;
private bool switchDown = false;
[Header("初始状态")]
public CameraSwitchInitialState initialState = CameraSwitchInitialState.Off;
[Header("Debug 控制")]
public bool debugTrigger = false;
private bool lastFlipState;
private void Start()
{
//IL_0068: 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_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//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_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_00d1: 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_00f8: 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)
flipper = ((Component)this).GetComponent<AR15HandleSightFlipper>();
switchDown = initialState == CameraSwitchInitialState.On;
lastFlipState = switchDown;
if ((Object)(object)switchHandle != (Object)null && (Object)(object)handleStartPrefab != (Object)null && (Object)(object)handleEndPrefab != (Object)null)
{
startPos = handleStartPrefab.transform.localPosition;
startRot = handleStartPrefab.transform.localRotation;
endPos = handleEndPrefab.transform.localPosition;
endRot = handleEndPrefab.transform.localRotation;
switchHandle.localPosition = ((!switchDown) ? startPos : endPos);
switchHandle.localRotation = ((!switchDown) ? startRot : endRot);
}
if ((Object)(object)flipper != (Object)null)
{
flipper.m_isLargeAperture = switchDown;
}
}
private void Update()
{
if (debugTrigger)
{
debugTrigger = false;
TriggerAction();
}
if ((Object)(object)flipper != (Object)null && flipper.m_isLargeAperture != lastFlipState)
{
lastFlipState = flipper.m_isLargeAperture;
switchDown = lastFlipState;
PlaySwitchAnimation(switchDown);
PlayToggleSound();
ActivateCamera();
}
}
public void TriggerAction()
{
switchDown = !switchDown;
PlaySwitchAnimation(switchDown);
PlayToggleSound();
ActivateCamera();
Debug.Log((object)"[FNAFCameraButton] Button Triggered");
}
private void ActivateCamera()
{
if ((Object)(object)cameraManager != (Object)null)
{
cameraManager.SwitchToCamera(cameraIndex);
}
}
private void PlayToggleSound()
{
if ((Object)(object)audioSource != (Object)null && (Object)(object)toggleSound != (Object)null)
{
audioSource.PlayOneShot(toggleSound);
}
}
private void PlaySwitchAnimation(bool down)
{
if (animCoroutine != null)
{
((MonoBehaviour)this).StopCoroutine(animCoroutine);
}
animCoroutine = ((MonoBehaviour)this).StartCoroutine(AnimateSwitch(down));
}
private IEnumerator AnimateSwitch(bool down)
{
if (!((Object)(object)switchHandle == (Object)null))
{
Vector3 fromPos = switchHandle.localPosition;
Quaternion fromRot = switchHandle.localRotation;
Vector3 toPos = ((!down) ? startPos : endPos);
Quaternion toRot = ((!down) ? startRot : endRot);
float t = 0f;
while (t < animDuration)
{
float lerp = t / animDuration;
switchHandle.localPosition = Vector3.Lerp(fromPos, toPos, lerp);
switchHandle.localRotation = Quaternion.Lerp(fromRot, toRot, lerp);
t += Time.deltaTime;
yield return null;
}
switchHandle.localPosition = toPos;
switchHandle.localRotation = toRot;
}
}
}
public class FNAFCameraManager : MonoBehaviour, IFNAFPowerConsumer
{
[Header("屏幕元素")]
public GameObject blackScreen;
public List<GameObject> cameraViews;
[Header("Cameras(与 Camera Views 一一对应的摄像头 Prefab)")]
public List<GameObject> cameras;
[Header("切换效果")]
public float switchBlackTime = 0.15f;
public AudioSource audioSource;
public AudioClip switchSound;
private int currentIndex = -1;
private Coroutine switchRoutine;
[Header("监控状态")]
public bool cameraOff = true;
public bool powerLocked = false;
[Header("耗电设置")]
public float cameraDrainRate = 0.2f;
private void Start()
{
cameraOff = true;
powerLocked = false;
ShowOnlyBlackScreen();
FNAFPowerManager fNAFPowerManager = Object.FindObjectOfType<FNAFPowerManager>();
if ((Object)(object)fNAFPowerManager != (Object)null)
{
fNAFPowerManager.OnPowerDepleted = (Action)Delegate.Combine(fNAFPowerManager.OnPowerDepleted, new Action(ForceBlackout));
}
}
private void ShowOnlyBlackScreen()
{
if ((Object)(object)blackScreen != (Object)null)
{
blackScreen.SetActive(true);
}
if (cameraViews != null)
{
for (int i = 0; i < cameraViews.Count; i++)
{
if ((Object)(object)cameraViews[i] != (Object)null)
{
cameraViews[i].SetActive(false);
}
}
}
if (cameras != null)
{
for (int j = 0; j < cameras.Count; j++)
{
if ((Object)(object)cameras[j] != (Object)null)
{
cameras[j].SetActive(false);
}
}
}
currentIndex = -1;
}
public void SwitchToCamera(int index)
{
if (!powerLocked && !cameraOff && cameraViews != null && index >= 0 && index < cameraViews.Count && index != currentIndex)
{
if (switchRoutine != null)
{
((MonoBehaviour)this).StopCoroutine(switchRoutine);
}
switchRoutine = ((MonoBehaviour)this).StartCoroutine(SwitchRoutine(index));
}
}
private IEnumerator SwitchRoutine(int targetIndex)
{
if ((Object)(object)audioSource != (Object)null && (Object)(object)switchSound != (Object)null)
{
audioSource.PlayOneShot(switchSound);
}
if ((Object)(object)blackScreen != (Object)null)
{
blackScreen.SetActive(true);
}
for (int i = 0; i < cameraViews.Count; i++)
{
if ((Object)(object)cameraViews[i] != (Object)null)
{
cameraViews[i].SetActive(false);
}
}
if (cameras != null)
{
for (int j = 0; j < cameras.Count; j++)
{
if ((Object)(object)cameras[j] != (Object)null)
{
cameras[j].SetActive(false);
}
}
}
if (switchBlackTime > 0f)
{
yield return (object)new WaitForSeconds(switchBlackTime);
}
GameObject targetView = cameraViews[targetIndex];
if ((Object)(object)targetView != (Object)null)
{
targetView.SetActive(true);
}
if (cameras != null && targetIndex < cameras.Count)
{
GameObject val = cameras[targetIndex];
if ((Object)(object)val != (Object)null)
{
val.SetActive(true);
}
}
if ((Object)(object)blackScreen != (Object)null)
{
blackScreen.SetActive(false);
}
currentIndex = targetIndex;
switchRoutine = null;
}
public void TurnOffCamera()
{
if (powerLocked)
{
return;
}
cameraOff = true;
if ((Object)(object)blackScreen != (Object)null)
{
blackScreen.SetActive(true);
}
if (cameraViews != null)
{
for (int i = 0; i < cameraViews.Count; i++)
{
if ((Object)(object)cameraViews[i] != (Object)null)
{
cameraViews[i].SetActive(false);
}
}
}
if (cameras != null)
{
for (int j = 0; j < cameras.Count; j++)
{
if ((Object)(object)cameras[j] != (Object)null)
{
cameras[j].SetActive(false);
}
}
}
currentIndex = -1;
}
public void TurnOnCamera()
{
if (!powerLocked)
{
cameraOff = false;
if (currentIndex >= 0)
{
SwitchToCamera(currentIndex);
}
else if (cameraViews != null && cameraViews.Count > 0)
{
SwitchToCamera(0);
}
}
}
public void ForceBlackout()
{
powerLocked = true;
cameraOff = true;
if ((Object)(object)blackScreen != (Object)null)
{
blackScreen.SetActive(true);
}
if (cameraViews != null)
{
for (int i = 0; i < cameraViews.Count; i++)
{
if ((Object)(object)cameraViews[i] != (Object)null)
{
cameraViews[i].SetActive(false);
}
}
}
if (cameras != null)
{
for (int j = 0; j < cameras.Count; j++)
{
if ((Object)(object)cameras[j] != (Object)null)
{
cameras[j].SetActive(false);
}
}
}
currentIndex = -1;
}
public bool IsConsumingPower()
{
if (powerLocked)
{
return false;
}
if (cameraOff)
{
return false;
}
return true;
}
public float GetPowerDrainRate()
{
return cameraDrainRate;
}
}
public class FNAFCameraOffSwitch : MonoBehaviour
{
[Header("监控管理器")]
public FNAFCameraManager cameraManager;
[Header("开关动画")]
public Transform switchHandle;
public GameObject handleStartPrefab;
public GameObject handleEndPrefab;
public float animDuration = 0.2f;
private Vector3 startPos;
private Vector3 endPos;
private Quaternion startRot;
private Quaternion endRot;
private Coroutine animCoroutine;
private AR15HandleSightFlipper flipper;
[Header("音效")]
public AudioSource audioSource;
public AudioClip toggleSound;
public AudioClip turnOffSound;
public AudioClip turnOnSound;
private bool switchDown = true;
private bool isAnimating = false;
[Header("Debug 控制")]
public bool debugToggle = false;
private void Start()
{
//IL_004d: 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_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_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: 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_00a0: 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)
flipper = ((Component)this).GetComponent<AR15HandleSightFlipper>();
if ((Object)(object)switchHandle != (Object)null && (Object)(object)handleStartPrefab != (Object)null && (Object)(object)handleEndPrefab != (Object)null)
{
startPos = handleStartPrefab.transform.localPosition;
startRot = handleStartPrefab.transform.localRotation;
endPos = handleEndPrefab.transform.localPosition;
endRot = handleEndPrefab.transform.localRotation;
switchHandle.localPosition = startPos;
switchHandle.localRotation = startRot;
}
if ((Object)(object)flipper != (Object)null)
{
flipper.m_isLargeAperture = switchDown;
}
}
private void Update()
{
if (debugToggle)
{
debugToggle = false;
ToggleSwitch();
}
if ((!((Object)(object)cameraManager != (Object)null) || !cameraManager.cameraOff || !((Object)(object)flipper != (Object)null) || flipper.m_isLargeAperture != switchDown) && !isAnimating && (Object)(object)flipper != (Object)null && flipper.m_isLargeAperture != switchDown)
{
ToggleSwitch();
}
}
private void ToggleSwitch()
{
if (isAnimating)
{
return;
}
switchDown = !switchDown;
PlaySwitchAnimation(switchDown);
if ((Object)(object)audioSource != (Object)null && (Object)(object)toggleSound != (Object)null)
{
audioSource.PlayOneShot(toggleSound);
}
if (switchDown)
{
if ((Object)(object)audioSource != (Object)null && (Object)(object)turnOffSound != (Object)null)
{
audioSource.PlayOneShot(turnOffSound);
}
if ((Object)(object)cameraManager != (Object)null)
{
cameraManager.TurnOffCamera();
}
}
else
{
if ((Object)(object)audioSource != (Object)null && (Object)(object)turnOnSound != (Object)null)
{
audioSource.PlayOneShot(turnOnSound);
}
if ((Object)(object)cameraManager != (Object)null)
{
cameraManager.TurnOnCamera();
}
}
if ((Object)(object)flipper != (Object)null)
{
flipper.m_isLargeAperture = switchDown;
}
}
private void PlaySwitchAnimation(bool down)
{
if (animCoroutine != null)
{
((MonoBehaviour)this).StopCoroutine(animCoroutine);
}
isAnimating = true;
animCoroutine = ((MonoBehaviour)this).StartCoroutine(AnimateSwitch(down));
}
private IEnumerator AnimateSwitch(bool down)
{
if (!((Object)(object)switchHandle == (Object)null))
{
Vector3 fromPos = switchHandle.localPosition;
Quaternion fromRot = switchHandle.localRotation;
Vector3 toPos = ((!down) ? startPos : endPos);
Quaternion toRot = ((!down) ? startRot : endRot);
float t = 0f;
while (t < animDuration)
{
float lerp = t / animDuration;
switchHandle.localPosition = Vector3.Lerp(fromPos, toPos, lerp);
switchHandle.localRotation = Quaternion.Lerp(fromRot, toRot, lerp);
t += Time.deltaTime;
yield return null;
}
switchHandle.localPosition = toPos;
switchHandle.localRotation = toRot;
isAnimating = false;
}
}
}
public class FNAFDeskFan : MonoBehaviour, IFNAFPowerConsumer
{
[Header("旋转部件(扇叶)")]
public Transform rotatePart;
[Header("旋转设置")]
public Vector3 rotationAxis = new Vector3(0f, 1f, 0f);
public float rotationSpeed = 300f;
[Header("音效")]
public AudioSource fanAudioSource;
[Header("输入开关(AR15 FlipSight)")]
public AR15HandleSightFlipper flipper;
[Header("电力系统")]
public FNAFPowerManager powerManager;
private bool fanEnabled = true;
private void Update()
{
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)flipper != (Object)null)
{
fanEnabled = flipper.m_isLargeAperture;
}
if ((Object)(object)powerManager != (Object)null && powerManager.IsPowerOut())
{
if ((Object)(object)fanAudioSource != (Object)null && fanAudioSource.isPlaying)
{
fanAudioSource.Stop();
}
}
else if (fanEnabled)
{
if ((Object)(object)rotatePart != (Object)null)
{
rotatePart.Rotate(rotationAxis * rotationSpeed * Time.deltaTime);
}
if ((Object)(object)fanAudioSource != (Object)null && !fanAudioSource.isPlaying)
{
fanAudioSource.Play();
}
}
else if ((Object)(object)fanAudioSource != (Object)null && fanAudioSource.isPlaying)
{
fanAudioSource.Stop();
}
}
public bool IsConsumingPower()
{
return fanEnabled;
}
public float GetPowerDrainRate()
{
return 0.2f;
}
}
public class FNAFDoor : MonoBehaviour, IFNAFPowerConsumer
{
public enum DoorState
{
Open,
Closed
}
[Serializable]
public class DoorAnimatedPart
{
public Transform target;
public GameObject startPrefab;
public GameObject endPrefab;
public float delay = 0f;
public float duration = 1f;
[HideInInspector]
public Vector3 startPos;
[HideInInspector]
public Vector3 endPos;
[HideInInspector]
public Quaternion startRot;
[HideInInspector]
public Quaternion endRot;
[HideInInspector]
public Vector3 startScale;
[HideInInspector]
public Vector3 endScale;
[HideInInspector]
public Coroutine runningCoroutine;
}
[Header("动画物体列表")]
public List<DoorAnimatedPart> doorParts = new List<DoorAnimatedPart>();
[Header("耗电设置")]
public float powerDrainRate = 1f;
[Header("门灯光提示")]
public List<Light> doorLights = new List<Light>();
public Color lightOpenColor = Color.green;
public Color lightClosedColor = Color.red;
[Header("门音效")]
public AudioSource audioSource;
public AudioClip openSound;
public AudioClip closeSound;
[Header("当前门状态(Output)")]
public DoorState currentState = DoorState.Open;
[Header("引用")]
public FNAFPowerManager powerManager;
public Action OnDoorClosedEvent;
public Action OnDoorOpenedEvent;
private bool lastPowerOut = false;
private bool fakePowerOut = false;
public void ForceDoorBroken()
{
fakePowerOut = true;
OpenDoor();
}
private void Start()
{
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: 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_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_00a2: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
foreach (DoorAnimatedPart doorPart in doorParts)
{
if (!((Object)(object)doorPart.target == (Object)null) && !((Object)(object)doorPart.startPrefab == (Object)null) && !((Object)(object)doorPart.endPrefab == (Object)null))
{
doorPart.startPos = doorPart.startPrefab.transform.localPosition;
doorPart.startRot = doorPart.startPrefab.transform.localRotation;
doorPart.startScale = doorPart.startPrefab.transform.localScale;
doorPart.endPos = doorPart.endPrefab.transform.localPosition;
doorPart.endRot = doorPart.endPrefab.transform.localRotation;
doorPart.endScale = doorPart.endPrefab.transform.localScale;
}
}
UpdateLights();
}
private void Update()
{
bool flag = (Object)(object)powerManager != (Object)null && powerManager.IsPowerOut();
if (flag && !lastPowerOut && currentState == DoorState.Closed && (Object)(object)audioSource != (Object)null && (Object)(object)openSound != (Object)null)
{
audioSource.PlayOneShot(openSound);
}
if ((flag || fakePowerOut) && currentState != 0)
{
OpenDoor();
}
lastPowerOut = flag;
}
public void TryCloseDoor()
{
if (!fakePowerOut && (!((Object)(object)powerManager != (Object)null) || !powerManager.IsPowerOut()))
{
CloseDoor();
}
}
public void TryOpenDoor()
{
OpenDoor();
}
public void OpenDoor()
{
currentState = DoorState.Open;
UpdateLights();
PlaySound(openSound);
if (OnDoorOpenedEvent != null)
{
OnDoorOpenedEvent();
}
foreach (DoorAnimatedPart doorPart in doorParts)
{
if (doorPart.runningCoroutine != null)
{
((MonoBehaviour)this).StopCoroutine(doorPart.runningCoroutine);
}
doorPart.runningCoroutine = ((MonoBehaviour)this).StartCoroutine(AnimatePart(doorPart, closing: false));
}
}
public void CloseDoor()
{
currentState = DoorState.Closed;
UpdateLights();
PlaySound(closeSound);
if (OnDoorClosedEvent != null)
{
OnDoorClosedEvent();
}
foreach (DoorAnimatedPart doorPart in doorParts)
{
if (doorPart.runningCoroutine != null)
{
((MonoBehaviour)this).StopCoroutine(doorPart.runningCoroutine);
}
doorPart.runningCoroutine = ((MonoBehaviour)this).StartCoroutine(AnimatePart(doorPart, closing: true));
}
}
private IEnumerator AnimatePart(DoorAnimatedPart part, bool closing)
{
if (part.delay > 0f)
{
yield return (object)new WaitForSeconds(part.delay);
}
Vector3 startPos = part.target.localPosition;
Quaternion startRot = part.target.localRotation;
Vector3 startScale = part.target.localScale;
Vector3 targetPos = ((!closing) ? part.startPos : part.endPos);
Quaternion targetRot = ((!closing) ? part.startRot : part.endRot);
Vector3 targetScale = ((!closing) ? part.startScale : part.endScale);
float t = 0f;
while (t < part.duration)
{
float lerp = t / part.duration;
part.target.localPosition = Vector3.Lerp(startPos, targetPos, lerp);
part.target.localRotation = Quaternion.Lerp(startRot, targetRot, lerp);
part.target.localScale = Vector3.Lerp(startScale, targetScale, lerp);
t += Time.deltaTime;
yield return null;
}
part.target.localPosition = targetPos;
part.target.localRotation = targetRot;
part.target.localScale = targetScale;
}
private void UpdateLights()
{
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
foreach (Light doorLight in doorLights)
{
if (!((Object)(object)doorLight == (Object)null))
{
doorLight.color = ((currentState != DoorState.Closed) ? lightOpenColor : lightClosedColor);
}
}
}
private void PlaySound(AudioClip clip)
{
if ((!((Object)(object)powerManager != (Object)null) || !powerManager.IsPowerOut()) && (Object)(object)audioSource != (Object)null && (Object)(object)clip != (Object)null)
{
audioSource.PlayOneShot(clip);
}
}
public bool IsConsumingPower()
{
return currentState == DoorState.Closed;
}
public float GetPowerDrainRate()
{
return powerDrainRate;
}
public bool IsDoorClosed()
{
return currentState == DoorState.Closed;
}
}
public enum SwitchInitialState
{
Off,
On
}
public class FNAFDoorSwitch : MonoBehaviour
{
[Header("门本体引用")]
public FNAFDoor door;
[Header("开关动画")]
public Transform switchHandle;
public GameObject handleStartPrefab;
public GameObject handleEndPrefab;
public float animDuration = 0.2f;
[Header("开关音效")]
public AudioSource switchAudioSource;
public AudioClip switchToggleSound;
public AudioClip switchOpenSound;
public AudioClip switchCloseSound;
private Vector3 startPos;
private Vector3 endPos;
private Quaternion startRot;
private Quaternion endRot;
private Coroutine animCoroutine;
private AR15HandleSightFlipp