Decompiled source of giant extension ladders v1.0.0

BepInEx/plugins/GiantExtensionLadders.dll

Decompiled a year ago
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GiantExtensionLadders.Behaviours;
using HarmonyLib;
using LethalLib.Modules;
using Unity.Netcode;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("BigLadderItem")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("BigLadderItem")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("b3c3d5ca-fe17-4291-92ca-a44e3ae22724")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace GiantExtensionLadders
{
	[BepInPlugin("inoyu.GiantExtensionLadders", "GiantExtensionLadders", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class GiantLadderBase : BaseUnityPlugin
	{
		private const string modGUID = "inoyu.GiantExtensionLadders";

		private const string modName = "GiantExtensionLadders";

		private const string modVersion = "1.0.0";

		private readonly Harmony harmony = new Harmony("inoyu.GiantExtensionLadders");

		private static GiantLadderBase Instance;

		internal static ManualLogSource mls;

		private const string bigLadderAssetsBundleName = "BigLadderAssets";

		private const string hugeLadderAssetsBundleName = "HugeLadderAssets";

		private const string itemPropertiesLocation = "Assets/extLadderTest/lcLadder/ExtensionLadder_0.asset";

		private const string item2PropertiesLocation = "Assets/extLadderTest/newLongerLadder/ExtensionLadder_0.asset";

		private const int MAX_PROPERTY_AMOUNT = 18;

		private const int bigLadderBasePrice = 75;

		private const int hugeLadderBasePrice = 160;

		private ConfigEntry<int> ladderPrice;

		private ConfigEntry<int> hugeLadderPrice;

		internal static List<MeshRenderer> meshRenderers;

		internal static List<Animator> animators;

		internal static List<Transform> transforms;

		internal static List<AudioClip> audioClips;

		internal static List<AudioSource> audioSources;

		internal static List<InteractTrigger> interactTriggers;

		internal static List<BoxCollider> boxColliders;

		internal static int propertyCounter;

		internal static List<MeshRenderer> hugeLadderMeshRenderers;

		internal static List<Animator> hugeLadderAnimators;

		internal static List<Transform> hugeLadderTransforms;

		internal static List<AudioClip> hugeLadderAudioClips;

		internal static List<AudioSource> hugeLadderAudioSources;

		internal static List<InteractTrigger> hugeLadderInteractTriggers;

		internal static List<BoxCollider> hugeLadderBoxColliders;

		internal static int propertyCounter2;

		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			mls = Logger.CreateLogSource("inoyu.GiantExtensionLadders");
			mls.LogInfo((object)"mod awake");
			mls.LogInfo((object)"loading ladder prices");
			ladderPrice = ((BaseUnityPlugin)this).Config.Bind<int>("BigLadderConfig", "ladderPrice", 75, "set's the price of the big ladder");
			hugeLadderPrice = ((BaseUnityPlugin)this).Config.Bind<int>("BigLadderConfig", "hugeLadderPrice", 160, "set's the price of the huge ladder");
			mls.LogInfo((object)"loading assetbundles");
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "BigLadderAssets");
			string text2 = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "HugeLadderAssets");
			AssetBundle val = AssetBundle.LoadFromFile(text);
			AssetBundle val2 = AssetBundle.LoadFromFile(text2);
			if ((Object)(object)val != (Object)null && (Object)(object)val2 != (Object)null)
			{
				mls.LogInfo((object)"successfully loaded two assetbundles from files");
			}
			else
			{
				mls.LogInfo((object)"failed to load assetbundles");
			}
			mls.LogInfo((object)"loading items from assetbundles");
			Item val3 = val.LoadAsset<Item>("Assets/extLadderTest/lcLadder/ExtensionLadder_0.asset");
			Item val4 = val2.LoadAsset<Item>("Assets/extLadderTest/newLongerLadder/ExtensionLadder_0.asset");
			if ((Object)(object)val3 != (Object)null && (Object)(object)val4 != (Object)null)
			{
				mls.LogInfo((object)"successfully loaded items from assetbundles");
			}
			else
			{
				mls.LogInfo((object)"failed to load items from item assetbundles");
			}
			GameObject spawnPrefab = val3.spawnPrefab;
			GameObject spawnPrefab2 = val4.spawnPrefab;
			mls.LogInfo((object)"attempting to build the big ladder");
			meshRenderers = spawnPrefab.GetComponentsInChildren<MeshRenderer>().ToList();
			animators = spawnPrefab.GetComponentsInChildren<Animator>().ToList();
			transforms = spawnPrefab.GetComponentsInChildren<Transform>().ToList();
			audioClips = val.LoadAllAssets<AudioClip>().ToList();
			audioSources = spawnPrefab.GetComponentsInChildren<AudioSource>().ToList();
			interactTriggers = spawnPrefab.GetComponentsInChildren<InteractTrigger>().ToList();
			boxColliders = spawnPrefab.GetComponentsInChildren<BoxCollider>().ToList();
			BigLadderItemScript bigLadderItemScript = spawnPrefab.AddComponent<BigLadderItemScript>();
			if ((Object)(object)spawnPrefab.GetComponent<BigLadderItemScript>() == (Object)null)
			{
				mls.LogInfo((object)"bigLadderScript failed");
			}
			else
			{
				mls.LogInfo((object)"bigLadderScript okay");
			}
			((GrabbableObject)bigLadderItemScript).grabbable = true;
			((GrabbableObject)bigLadderItemScript).grabbableToEnemies = true;
			((GrabbableObject)bigLadderItemScript).itemProperties = val3;
			foreach (MeshRenderer meshRenderer in meshRenderers)
			{
				if (((Object)meshRenderer).name.Equals("LadderBox"))
				{
					propertyCounter++;
					((GrabbableObject)bigLadderItemScript).mainObjectRenderer = meshRenderer;
					mls.LogInfo((object)("found :" + ((Object)meshRenderer).name));
					break;
				}
			}
			foreach (Animator animator in animators)
			{
				if (((Object)animator).name.Equals("AnimContainer"))
				{
					propertyCounter++;
					bigLadderItemScript.ladderAnimator = animator;
					mls.LogInfo((object)("found :" + ((Object)animator).name));
				}
				if (((Object)animator).name.Equals("MeshContainer"))
				{
					propertyCounter++;
					bigLadderItemScript.ladderRotateAnimator = animator;
					mls.LogInfo((object)("found :" + ((Object)animator).name));
				}
			}
			foreach (Transform transform in transforms)
			{
				if (((Object)transform).name.Equals("Base"))
				{
					propertyCounter++;
					bigLadderItemScript.baseNode = transform;
					mls.LogInfo((object)("found :" + ((Object)transform).name));
				}
				if (((Object)transform).name.Equals("TopPosition"))
				{
					propertyCounter++;
					bigLadderItemScript.topNode = transform;
					mls.LogInfo((object)("found :" + ((Object)transform).name));
				}
				if (((Object)transform).name.Equals("MovableNode"))
				{
					propertyCounter++;
					bigLadderItemScript.moveableNode = transform;
					mls.LogInfo((object)("found :" + ((Object)transform).name));
				}
			}
			foreach (AudioClip audioClip in audioClips)
			{
				if (((Object)audioClip).name.Equals("ExtensionLadderHitWall"))
				{
					propertyCounter++;
					bigLadderItemScript.hitRoof = audioClip;
				}
				if (((Object)audioClip).name.Equals("ExtensionLadderHitWall2"))
				{
					propertyCounter += 2;
					bigLadderItemScript.fullExtend = audioClip;
					bigLadderItemScript.hitWall = audioClip;
				}
				if (((Object)audioClip).name.Equals("ExtensionLadderExtend"))
				{
					propertyCounter++;
					bigLadderItemScript.ladderExtendSFX = audioClip;
				}
				if (((Object)audioClip).name.Equals("ExtensionLadderShrink"))
				{
					propertyCounter++;
					bigLadderItemScript.ladderShrinkSFX = audioClip;
				}
				if (((Object)audioClip).name.Equals("ExtensionLadderAlarm"))
				{
					propertyCounter++;
					bigLadderItemScript.blinkWarningSFX = audioClip;
				}
				if (((Object)audioClip).name.Equals("ExtensionLadderLidOpen"))
				{
					propertyCounter++;
					bigLadderItemScript.lidOpenSFX = audioClip;
				}
				mls.LogInfo((object)((Object)audioClip).name);
			}
			foreach (AudioSource audioSource in audioSources)
			{
				if (((Object)audioSource).name.Equals("LadderAudio"))
				{
					propertyCounter++;
					bigLadderItemScript.ladderAudio = audioSource;
					mls.LogInfo((object)("found :" + ((Object)audioSource).name));
					break;
				}
			}
			foreach (InteractTrigger interactTrigger in interactTriggers)
			{
				if (((Object)interactTrigger).name.Equals("ExtLadderTrigger"))
				{
					propertyCounter++;
					bigLadderItemScript.ladderScript = interactTrigger;
					mls.LogInfo((object)("found :" + ((Object)interactTrigger).name));
					break;
				}
			}
			foreach (BoxCollider boxCollider in boxColliders)
			{
				if (((Object)boxCollider).name.Equals("ExtLadderTrigger"))
				{
					propertyCounter++;
					bigLadderItemScript.interactCollider = (Collider)(object)boxCollider;
					mls.LogInfo((object)("found :" + ((Object)boxCollider).name));
				}
				if (((Object)boxCollider).name.Equals("LadderBridgeCollider"))
				{
					propertyCounter++;
					bigLadderItemScript.bridgeCollider = (Collider)(object)boxCollider;
					mls.LogInfo((object)("found :" + ((Object)boxCollider).name));
				}
				if (((Object)boxCollider).name.Equals("KillTrigger"))
				{
					propertyCounter++;
					bigLadderItemScript.killTrigger = (Collider)(object)boxCollider;
					mls.LogInfo((object)("found :" + ((Object)boxCollider).name));
				}
			}
			if (propertyCounter == 18)
			{
				mls.LogInfo((object)"all properties found");
			}
			else
			{
				mls.LogInfo((object)("NOT all properties found. Counter: " + propertyCounter));
			}
			mls.LogInfo((object)"attempting to build the huge ladder");
			hugeLadderMeshRenderers = spawnPrefab2.GetComponentsInChildren<MeshRenderer>().ToList();
			hugeLadderAnimators = spawnPrefab2.GetComponentsInChildren<Animator>().ToList();
			hugeLadderTransforms = spawnPrefab2.GetComponentsInChildren<Transform>().ToList();
			hugeLadderAudioClips = val2.LoadAllAssets<AudioClip>().ToList();
			hugeLadderAudioSources = spawnPrefab2.GetComponentsInChildren<AudioSource>().ToList();
			hugeLadderInteractTriggers = spawnPrefab2.GetComponentsInChildren<InteractTrigger>().ToList();
			hugeLadderBoxColliders = spawnPrefab2.GetComponentsInChildren<BoxCollider>().ToList();
			HugeLadderItemScript hugeLadderItemScript = spawnPrefab2.AddComponent<HugeLadderItemScript>();
			if ((Object)(object)spawnPrefab2.GetComponent<HugeLadderItemScript>() == (Object)null)
			{
				mls.LogInfo((object)"hugeLadderScript failed");
			}
			else
			{
				mls.LogInfo((object)"hugeLadderScript okay");
			}
			((GrabbableObject)hugeLadderItemScript).grabbable = true;
			((GrabbableObject)hugeLadderItemScript).grabbableToEnemies = true;
			((GrabbableObject)hugeLadderItemScript).itemProperties = val4;
			foreach (MeshRenderer hugeLadderMeshRenderer in hugeLadderMeshRenderers)
			{
				if (((Object)hugeLadderMeshRenderer).name.Equals("LadderBox"))
				{
					propertyCounter2++;
					((GrabbableObject)hugeLadderItemScript).mainObjectRenderer = hugeLadderMeshRenderer;
					mls.LogInfo((object)("found :" + ((Object)hugeLadderMeshRenderer).name));
					break;
				}
			}
			foreach (Animator hugeLadderAnimator in hugeLadderAnimators)
			{
				if (((Object)hugeLadderAnimator).name.Equals("AnimContainer"))
				{
					propertyCounter2++;
					hugeLadderItemScript.ladderAnimator = hugeLadderAnimator;
					mls.LogInfo((object)("found :" + ((Object)hugeLadderAnimator).name));
				}
				if (((Object)hugeLadderAnimator).name.Equals("MeshContainer"))
				{
					propertyCounter2++;
					hugeLadderItemScript.ladderRotateAnimator = hugeLadderAnimator;
					mls.LogInfo((object)("found :" + ((Object)hugeLadderAnimator).name));
				}
			}
			foreach (Transform hugeLadderTransform in hugeLadderTransforms)
			{
				if (((Object)hugeLadderTransform).name.Equals("Base"))
				{
					propertyCounter2++;
					hugeLadderItemScript.baseNode = hugeLadderTransform;
					mls.LogInfo((object)("found :" + ((Object)hugeLadderTransform).name));
				}
				if (((Object)hugeLadderTransform).name.Equals("TopPosition"))
				{
					propertyCounter2++;
					hugeLadderItemScript.topNode = hugeLadderTransform;
					mls.LogInfo((object)("found :" + ((Object)hugeLadderTransform).name));
				}
				if (((Object)hugeLadderTransform).name.Equals("MovableNode"))
				{
					propertyCounter2++;
					hugeLadderItemScript.moveableNode = hugeLadderTransform;
					mls.LogInfo((object)("found :" + ((Object)hugeLadderTransform).name));
				}
			}
			foreach (AudioClip hugeLadderAudioClip in hugeLadderAudioClips)
			{
				if (((Object)hugeLadderAudioClip).name.Equals("ExtensionLadderHitWall"))
				{
					propertyCounter2++;
					hugeLadderItemScript.hitRoof = hugeLadderAudioClip;
				}
				if (((Object)hugeLadderAudioClip).name.Equals("ExtensionLadderHitWall2"))
				{
					propertyCounter2 += 2;
					hugeLadderItemScript.fullExtend = hugeLadderAudioClip;
					hugeLadderItemScript.hitWall = hugeLadderAudioClip;
				}
				if (((Object)hugeLadderAudioClip).name.Equals("ExtensionLadderExtend"))
				{
					propertyCounter2++;
					hugeLadderItemScript.ladderExtendSFX = hugeLadderAudioClip;
				}
				if (((Object)hugeLadderAudioClip).name.Equals("ExtensionLadderShrink"))
				{
					propertyCounter2++;
					hugeLadderItemScript.ladderShrinkSFX = hugeLadderAudioClip;
				}
				if (((Object)hugeLadderAudioClip).name.Equals("ExtensionLadderAlarm"))
				{
					propertyCounter2++;
					hugeLadderItemScript.blinkWarningSFX = hugeLadderAudioClip;
				}
				if (((Object)hugeLadderAudioClip).name.Equals("ExtensionLadderLidOpen"))
				{
					propertyCounter2++;
					hugeLadderItemScript.lidOpenSFX = hugeLadderAudioClip;
				}
				mls.LogInfo((object)((Object)hugeLadderAudioClip).name);
			}
			foreach (AudioSource hugeLadderAudioSource in hugeLadderAudioSources)
			{
				if (((Object)hugeLadderAudioSource).name.Equals("LadderAudio"))
				{
					propertyCounter2++;
					hugeLadderItemScript.ladderAudio = hugeLadderAudioSource;
					mls.LogInfo((object)("found :" + ((Object)hugeLadderAudioSource).name));
					break;
				}
			}
			foreach (InteractTrigger hugeLadderInteractTrigger in hugeLadderInteractTriggers)
			{
				if (((Object)hugeLadderInteractTrigger).name.Equals("ExtLadderTrigger"))
				{
					propertyCounter2++;
					hugeLadderItemScript.ladderScript = hugeLadderInteractTrigger;
					mls.LogInfo((object)("found :" + ((Object)hugeLadderInteractTrigger).name));
					break;
				}
			}
			foreach (BoxCollider hugeLadderBoxCollider in hugeLadderBoxColliders)
			{
				if (((Object)hugeLadderBoxCollider).name.Equals("ExtLadderTrigger"))
				{
					propertyCounter2++;
					hugeLadderItemScript.interactCollider = (Collider)(object)hugeLadderBoxCollider;
					mls.LogInfo((object)("found :" + ((Object)hugeLadderBoxCollider).name));
				}
				if (((Object)hugeLadderBoxCollider).name.Equals("LadderBridgeCollider"))
				{
					propertyCounter2++;
					hugeLadderItemScript.bridgeCollider = (Collider)(object)hugeLadderBoxCollider;
					mls.LogInfo((object)("found :" + ((Object)hugeLadderBoxCollider).name));
				}
				if (((Object)hugeLadderBoxCollider).name.Equals("KillTrigger"))
				{
					propertyCounter2++;
					hugeLadderItemScript.killTrigger = (Collider)(object)hugeLadderBoxCollider;
					mls.LogInfo((object)("found :" + ((Object)hugeLadderBoxCollider).name));
				}
			}
			if (propertyCounter2 == 18)
			{
				mls.LogInfo((object)"all properties found");
			}
			else
			{
				mls.LogInfo((object)("NOT all properties found. Counter: " + propertyCounter2));
			}
			NetworkPrefabs.RegisterNetworkPrefab(val3.spawnPrefab);
			NetworkPrefabs.RegisterNetworkPrefab(val4.spawnPrefab);
			mls.LogInfo((object)"registered network prefabs.");
			Utilities.FixMixerGroups(val3.spawnPrefab);
			Utilities.FixMixerGroups(val4.spawnPrefab);
			mls.LogInfo((object)"fixed mixers.");
			TerminalNode val5 = ScriptableObject.CreateInstance<TerminalNode>();
			val5.clearPreviousText = true;
			val5.displayText = "This ladder seems longer than the normal one..\n\n";
			Items.RegisterShopItem(val3, (TerminalNode)null, (TerminalNode)null, val5, ladderPrice.Value);
			TerminalNode val6 = ScriptableObject.CreateInstance<TerminalNode>();
			val6.clearPreviousText = true;
			val6.displayText = "This ladder seems EVEN longer than the big one..\n\n";
			Items.RegisterShopItem(val4, (TerminalNode)null, (TerminalNode)null, val6, hugeLadderPrice.Value);
			mls.LogInfo((object)"items should be in shop.");
			harmony.PatchAll(typeof(GiantLadderBase));
		}
	}
}
namespace GiantExtensionLadders.Behaviours
{
	internal class HugeLadderItemScript : GrabbableObject
	{
		private bool ladderActivated;

		private bool ladderAnimationBegun;

		private Coroutine ladderAnimationCoroutine;

		private RaycastHit hit;

		private int layerMask = 268437761;

		private float rotateAmount;

		private float extendAmount;

		private float ladderTimer;

		private bool ladderBlinkWarning;

		private AudioClip ladderFallSFX = null;

		public Animator ladderAnimator;

		public Animator ladderRotateAnimator;

		public Transform baseNode;

		public Transform topNode;

		public Transform moveableNode;

		public AudioClip hitRoof;

		public AudioClip fullExtend;

		public AudioClip hitWall;

		public AudioClip ladderExtendSFX;

		public AudioClip ladderShrinkSFX;

		public AudioClip blinkWarningSFX;

		public AudioClip lidOpenSFX;

		public AudioSource ladderAudio;

		public InteractTrigger ladderScript;

		public Collider interactCollider;

		public Collider bridgeCollider;

		public Collider killTrigger;

		private const float LADDER_ALARM_TIME = 25f;

		private const float LADDER_EXTENDED_TIME = 30f;

		private const float MAX_EXTENSION = 34.4f;

		private const float MIN_ROTATION_COLLISION_CHECK = 60f;

		private const int LADDER_HIT_LINECAST_MULTIPLIER = 4;

		private const int LADDER_HIT_CHECK_MIN_HEIGHT = 8;

		private const float LADDER_HEIGHT_MULTIPLIER = 14.15f;

		public override void Update()
		{
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			((GrabbableObject)this).Update();
			if ((Object)(object)base.playerHeldBy == (Object)null && !base.isHeld && !base.isHeldByEnemy && base.reachedFloorTarget && ladderActivated)
			{
				if (!ladderAnimationBegun)
				{
					ladderTimer = 0f;
					StartLadderAnimation();
				}
				else if (ladderAnimationBegun)
				{
					ladderTimer += Time.deltaTime;
					if (!ladderBlinkWarning && ladderTimer > 25f)
					{
						ladderBlinkWarning = true;
						ladderAnimator.SetBool("blinkWarning", true);
						ladderAudio.clip = blinkWarningSFX;
						ladderAudio.Play();
					}
					else if (ladderTimer >= 30f)
					{
						ladderActivated = false;
						ladderBlinkWarning = false;
						ladderAudio.Stop();
						ladderAnimator.SetBool("blinkWarning", false);
					}
				}
				return;
			}
			if (ladderAnimationBegun)
			{
				ladderAnimationBegun = false;
				ladderAudio.Stop();
				killTrigger.enabled = false;
				bridgeCollider.enabled = false;
				interactCollider.enabled = false;
				if (ladderAnimationCoroutine != null)
				{
					((MonoBehaviour)this).StopCoroutine(ladderAnimationCoroutine);
				}
				ladderAnimator.SetBool("blinkWarning", false);
				((Component)ladderAudio).transform.position = ((Component)this).transform.position;
				ladderAudio.PlayOneShot(ladderShrinkSFX);
				ladderActivated = false;
			}
			killTrigger.enabled = false;
			ladderScript.interactable = false;
			if ((Object)(object)GameNetworkManager.Instance.localPlayerController != (Object)null && (Object)(object)GameNetworkManager.Instance.localPlayerController.currentTriggerInAnimationWith == (Object)(object)ladderScript)
			{
				ladderScript.CancelAnimationExternally();
			}
			if (rotateAmount > 0f)
			{
				rotateAmount = Mathf.Max(rotateAmount - Time.deltaTime * 2f, 0f);
				ladderRotateAnimator.SetFloat("rotationAmount", rotateAmount);
			}
			else
			{
				ladderRotateAnimator.SetFloat("rotationAmount", 0f);
			}
			if (extendAmount > 0f)
			{
				extendAmount = Mathf.Max(extendAmount - Time.deltaTime * 2f, 0f);
				ladderAnimator.SetFloat("extensionAmount", extendAmount);
			}
			else
			{
				ladderAnimator.SetBool("openLid", false);
				ladderAnimator.SetBool("extend", false);
				ladderAnimator.SetFloat("extensionAmount", 0f);
			}
		}

		private void StartLadderAnimation()
		{
			ladderAnimationBegun = true;
			ladderScript.interactable = false;
			if (ladderAnimationCoroutine != null)
			{
				((MonoBehaviour)this).StopCoroutine(ladderAnimationCoroutine);
			}
			ladderAnimationCoroutine = ((MonoBehaviour)this).StartCoroutine(LadderAnimation());
		}

		private IEnumerator LadderAnimation()
		{
			ladderAudio.volume = 1f;
			ladderScript.interactable = false;
			interactCollider.enabled = false;
			bridgeCollider.enabled = false;
			killTrigger.enabled = false;
			ladderAnimator.SetBool("openLid", false);
			ladderAnimator.SetBool("extend", false);
			yield return null;
			ladderAnimator.SetBool("openLid", true);
			((Component)ladderAudio).transform.position = ((Component)this).transform.position;
			ladderAudio.PlayOneShot(lidOpenSFX, 1f);
			RoundManager.Instance.PlayAudibleNoise(((Component)ladderAudio).transform.position, 18f, 0.8f, 0, base.isInShipRoom, 0);
			yield return (object)new WaitForSeconds(1f);
			ladderAnimator.SetBool("extend", true);
			float ladderExtendAmountNormalized = GetLadderExtensionDistance() / 34.4f;
			float ladderRotateAmountNormalized = Mathf.Clamp(GetLadderRotationDegrees(ladderExtendAmountNormalized) / -90f, 0f, 0.99f);
			ladderAudio.clip = ladderExtendSFX;
			ladderAudio.Play();
			float currentNormalizedTime3 = 0f;
			float speedMultiplier3 = 0.1f;
			while (currentNormalizedTime3 < ladderExtendAmountNormalized)
			{
				speedMultiplier3 += Time.deltaTime * 2f;
				currentNormalizedTime3 = Mathf.Min(currentNormalizedTime3 + Time.deltaTime * speedMultiplier3, ladderExtendAmountNormalized);
				ladderAnimator.SetFloat("extensionAmount", currentNormalizedTime3);
				yield return null;
			}
			extendAmount = currentNormalizedTime3;
			interactCollider.enabled = true;
			bridgeCollider.enabled = false;
			killTrigger.enabled = false;
			ladderAudio.Stop();
			if (ladderExtendAmountNormalized == 1f)
			{
				((Component)ladderAudio).transform.position = ((Component)baseNode).transform.position + ((Component)baseNode).transform.up * 34.4f;
				ladderAudio.PlayOneShot(fullExtend, 0.7f);
				WalkieTalkie.TransmitOneShotAudio(ladderAudio, fullExtend, 0.7f);
				RoundManager.Instance.PlayAudibleNoise(((Component)ladderAudio).transform.position, 8f, 0.5f, 0, base.isInShipRoom, 0);
			}
			else
			{
				((Component)ladderAudio).transform.position = ((Component)baseNode).transform.position + ((Component)baseNode).transform.up * (ladderExtendAmountNormalized * 34.4f);
				ladderAudio.PlayOneShot(hitRoof);
				WalkieTalkie.TransmitOneShotAudio(ladderAudio, hitRoof, 1f);
				RoundManager.Instance.PlayAudibleNoise(((Component)ladderAudio).transform.position, 17f, 0.8f, 0, base.isInShipRoom, 0);
			}
			yield return (object)new WaitForSeconds(0.4f);
			ladderAudio.clip = ladderFallSFX;
			ladderAudio.Play();
			ladderAudio.volume = 0f;
			speedMultiplier3 = 0.15f;
			currentNormalizedTime3 = 0f;
			while (currentNormalizedTime3 < ladderRotateAmountNormalized)
			{
				speedMultiplier3 += Time.deltaTime * 2f;
				currentNormalizedTime3 = Mathf.Min(currentNormalizedTime3 + Time.deltaTime * speedMultiplier3, ladderRotateAmountNormalized);
				if (ladderExtendAmountNormalized > 0.6f && currentNormalizedTime3 > 0.5f)
				{
					killTrigger.enabled = true;
				}
				ladderAudio.volume = Mathf.Min(ladderAudio.volume + Time.deltaTime * 1.75f, 1f);
				ladderRotateAnimator.SetFloat("rotationAmount", currentNormalizedTime3);
				yield return null;
			}
			rotateAmount = ladderRotateAmountNormalized;
			ladderAudio.volume = 1f;
			ladderAudio.Stop();
			((Component)ladderAudio).transform.position = ((Component)moveableNode).transform.position;
			ladderAudio.PlayOneShot(hitWall, Mathf.Min(ladderRotateAmountNormalized + 0.3f, 1f));
			RoundManager.Instance.PlayAudibleNoise(((Component)ladderAudio).transform.position, 18f, 0.7f, 0, base.isInShipRoom, 0);
			if (ladderRotateAmountNormalized * 90f < 60f)
			{
				ladderScript.interactable = true;
				interactCollider.enabled = true;
			}
			else
			{
				bridgeCollider.enabled = true;
			}
			killTrigger.enabled = false;
		}

		private float GetLadderExtensionDistance()
		{
			//IL_000c: 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)
			if (Physics.Raycast(((Component)baseNode).transform.position, Vector3.up, ref hit, 34.4f, layerMask, (QueryTriggerInteraction)1))
			{
				return ((RaycastHit)(ref hit)).distance;
			}
			return 34.4f;
		}

		private float GetLadderRotationDegrees(float topOfLadder)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: 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_0066: 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_008e: 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)
			float num = 90f;
			for (float num2 = 56.6f; num2 >= 8f; num2 -= 1f)
			{
				float num3 = 0.6075f * num2;
				((Component)moveableNode).transform.localPosition = new Vector3(0f, num3, 0f);
				baseNode.localEulerAngles = Vector3.zero;
				for (int i = 1; i < 40; i++)
				{
					Vector3 position = ((Component)moveableNode).transform.position;
					baseNode.localEulerAngles = new Vector3((float)(-i / 2) * 4.5f, 0f, 0f);
					if (Physics.Linecast(position, ((Component)moveableNode).transform.position, layerMask, (QueryTriggerInteraction)1))
					{
						float num4 = (float)(i / 2 - 1) * 4.5f;
						if (num4 < num)
						{
							num = num4;
						}
						break;
					}
				}
				if (num <= 8f)
				{
					break;
				}
			}
			return 0f - num;
		}

		public override void DiscardItem()
		{
			((GrabbableObject)this).DiscardItem();
		}

		public override void EquipItem()
		{
			((GrabbableObject)this).EquipItem();
		}

		public override void DiscardItemFromEnemy()
		{
			((GrabbableObject)this).DiscardItemFromEnemy();
			ladderActivated = true;
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			//IL_0026: 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)
			((GrabbableObject)this).ItemActivate(used, buttonDown);
			ladderActivated = true;
			if (((NetworkBehaviour)this).IsOwner)
			{
				base.playerHeldBy.DiscardHeldObject(false, (NetworkObject)null, default(Vector3), true);
			}
		}

		protected override void __initializeVariables()
		{
			((GrabbableObject)this).__initializeVariables();
		}

		protected override string __getTypeName()
		{
			return "BigLadderItem";
		}
	}
	internal class BigLadderItemScript : GrabbableObject
	{
		private bool ladderActivated;

		private bool ladderAnimationBegun;

		private Coroutine ladderAnimationCoroutine;

		private RaycastHit hit;

		private int layerMask = 268437761;

		private float rotateAmount;

		private float extendAmount;

		private float ladderTimer;

		private bool ladderBlinkWarning;

		private AudioClip ladderFallSFX = null;

		public Animator ladderAnimator;

		public Animator ladderRotateAnimator;

		public Transform baseNode;

		public Transform topNode;

		public Transform moveableNode;

		public AudioClip hitRoof;

		public AudioClip fullExtend;

		public AudioClip hitWall;

		public AudioClip ladderExtendSFX;

		public AudioClip ladderShrinkSFX;

		public AudioClip blinkWarningSFX;

		public AudioClip lidOpenSFX;

		public AudioSource ladderAudio;

		public InteractTrigger ladderScript;

		public Collider interactCollider;

		public Collider bridgeCollider;

		public Collider killTrigger;

		private const float LADDER_ALARM_TIME = 20f;

		private const float LADDER_EXTENDED_TIME = 25f;

		private const float MAX_EXTENSION = 17f;

		private const float MIN_ROTATION_COLLISION_CHECK = 60f;

		private const int LADDER_HIT_LINECAST_MULTIPLIER = 3;

		private const int LADDER_HIT_CHECK_MIN_HEIGHT = 8;

		private const float LADDER_HEIGHT_MULTIPLIER = 7f;

		public override void Update()
		{
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			((GrabbableObject)this).Update();
			if ((Object)(object)base.playerHeldBy == (Object)null && !base.isHeld && !base.isHeldByEnemy && base.reachedFloorTarget && ladderActivated)
			{
				if (!ladderAnimationBegun)
				{
					ladderTimer = 0f;
					StartLadderAnimation();
				}
				else if (ladderAnimationBegun)
				{
					ladderTimer += Time.deltaTime;
					if (!ladderBlinkWarning && ladderTimer > 20f)
					{
						ladderBlinkWarning = true;
						ladderAnimator.SetBool("blinkWarning", true);
						ladderAudio.clip = blinkWarningSFX;
						ladderAudio.Play();
					}
					else if (ladderTimer >= 25f)
					{
						ladderActivated = false;
						ladderBlinkWarning = false;
						ladderAudio.Stop();
						ladderAnimator.SetBool("blinkWarning", false);
					}
				}
				return;
			}
			if (ladderAnimationBegun)
			{
				ladderAnimationBegun = false;
				ladderAudio.Stop();
				killTrigger.enabled = false;
				bridgeCollider.enabled = false;
				interactCollider.enabled = false;
				if (ladderAnimationCoroutine != null)
				{
					((MonoBehaviour)this).StopCoroutine(ladderAnimationCoroutine);
				}
				ladderAnimator.SetBool("blinkWarning", false);
				((Component)ladderAudio).transform.position = ((Component)this).transform.position;
				ladderAudio.PlayOneShot(ladderShrinkSFX);
				ladderActivated = false;
			}
			killTrigger.enabled = false;
			ladderScript.interactable = false;
			if ((Object)(object)GameNetworkManager.Instance.localPlayerController != (Object)null && (Object)(object)GameNetworkManager.Instance.localPlayerController.currentTriggerInAnimationWith == (Object)(object)ladderScript)
			{
				ladderScript.CancelAnimationExternally();
			}
			if (rotateAmount > 0f)
			{
				rotateAmount = Mathf.Max(rotateAmount - Time.deltaTime * 2f, 0f);
				ladderRotateAnimator.SetFloat("rotationAmount", rotateAmount);
			}
			else
			{
				ladderRotateAnimator.SetFloat("rotationAmount", 0f);
			}
			if (extendAmount > 0f)
			{
				extendAmount = Mathf.Max(extendAmount - Time.deltaTime * 2f, 0f);
				ladderAnimator.SetFloat("extensionAmount", extendAmount);
			}
			else
			{
				ladderAnimator.SetBool("openLid", false);
				ladderAnimator.SetBool("extend", false);
				ladderAnimator.SetFloat("extensionAmount", 0f);
			}
		}

		private void StartLadderAnimation()
		{
			ladderAnimationBegun = true;
			ladderScript.interactable = false;
			if (ladderAnimationCoroutine != null)
			{
				((MonoBehaviour)this).StopCoroutine(ladderAnimationCoroutine);
			}
			ladderAnimationCoroutine = ((MonoBehaviour)this).StartCoroutine(LadderAnimation());
		}

		private IEnumerator LadderAnimation()
		{
			ladderAudio.volume = 1f;
			ladderScript.interactable = false;
			interactCollider.enabled = false;
			bridgeCollider.enabled = false;
			killTrigger.enabled = false;
			ladderAnimator.SetBool("openLid", false);
			ladderAnimator.SetBool("extend", false);
			yield return null;
			ladderAnimator.SetBool("openLid", true);
			((Component)ladderAudio).transform.position = ((Component)this).transform.position;
			ladderAudio.PlayOneShot(lidOpenSFX, 1f);
			RoundManager.Instance.PlayAudibleNoise(((Component)ladderAudio).transform.position, 18f, 0.8f, 0, base.isInShipRoom, 0);
			yield return (object)new WaitForSeconds(1f);
			ladderAnimator.SetBool("extend", true);
			float ladderExtendAmountNormalized = GetLadderExtensionDistance() / 17f;
			float ladderRotateAmountNormalized = Mathf.Clamp(GetLadderRotationDegrees(ladderExtendAmountNormalized) / -90f, 0f, 0.99f);
			ladderAudio.clip = ladderExtendSFX;
			ladderAudio.Play();
			float currentNormalizedTime3 = 0f;
			float speedMultiplier3 = 0.1f;
			while (currentNormalizedTime3 < ladderExtendAmountNormalized)
			{
				speedMultiplier3 += Time.deltaTime * 2f;
				currentNormalizedTime3 = Mathf.Min(currentNormalizedTime3 + Time.deltaTime * speedMultiplier3, ladderExtendAmountNormalized);
				ladderAnimator.SetFloat("extensionAmount", currentNormalizedTime3);
				yield return null;
			}
			extendAmount = currentNormalizedTime3;
			interactCollider.enabled = true;
			bridgeCollider.enabled = false;
			killTrigger.enabled = false;
			ladderAudio.Stop();
			if (ladderExtendAmountNormalized == 1f)
			{
				((Component)ladderAudio).transform.position = ((Component)baseNode).transform.position + ((Component)baseNode).transform.up * 17f;
				ladderAudio.PlayOneShot(fullExtend, 0.7f);
				WalkieTalkie.TransmitOneShotAudio(ladderAudio, fullExtend, 0.7f);
				RoundManager.Instance.PlayAudibleNoise(((Component)ladderAudio).transform.position, 8f, 0.5f, 0, base.isInShipRoom, 0);
			}
			else
			{
				((Component)ladderAudio).transform.position = ((Component)baseNode).transform.position + ((Component)baseNode).transform.up * (ladderExtendAmountNormalized * 17f);
				ladderAudio.PlayOneShot(hitRoof);
				WalkieTalkie.TransmitOneShotAudio(ladderAudio, hitRoof, 1f);
				RoundManager.Instance.PlayAudibleNoise(((Component)ladderAudio).transform.position, 17f, 0.8f, 0, base.isInShipRoom, 0);
			}
			yield return (object)new WaitForSeconds(0.4f);
			ladderAudio.clip = ladderFallSFX;
			ladderAudio.Play();
			ladderAudio.volume = 0f;
			speedMultiplier3 = 0.15f;
			currentNormalizedTime3 = 0f;
			while (currentNormalizedTime3 < ladderRotateAmountNormalized)
			{
				speedMultiplier3 += Time.deltaTime * 2f;
				currentNormalizedTime3 = Mathf.Min(currentNormalizedTime3 + Time.deltaTime * speedMultiplier3, ladderRotateAmountNormalized);
				if (ladderExtendAmountNormalized > 0.6f && currentNormalizedTime3 > 0.5f)
				{
					killTrigger.enabled = true;
				}
				ladderAudio.volume = Mathf.Min(ladderAudio.volume + Time.deltaTime * 1.75f, 1f);
				ladderRotateAnimator.SetFloat("rotationAmount", currentNormalizedTime3);
				yield return null;
			}
			rotateAmount = ladderRotateAmountNormalized;
			ladderAudio.volume = 1f;
			ladderAudio.Stop();
			((Component)ladderAudio).transform.position = ((Component)moveableNode).transform.position;
			ladderAudio.PlayOneShot(hitWall, Mathf.Min(ladderRotateAmountNormalized + 0.3f, 1f));
			RoundManager.Instance.PlayAudibleNoise(((Component)ladderAudio).transform.position, 18f, 0.7f, 0, base.isInShipRoom, 0);
			if (ladderRotateAmountNormalized * 90f < 60f)
			{
				ladderScript.interactable = true;
				interactCollider.enabled = true;
			}
			else
			{
				bridgeCollider.enabled = true;
			}
			killTrigger.enabled = false;
		}

		private float GetLadderExtensionDistance()
		{
			//IL_000c: 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)
			if (Physics.Raycast(((Component)baseNode).transform.position, Vector3.up, ref hit, 17f, layerMask, (QueryTriggerInteraction)1))
			{
				return ((RaycastHit)(ref hit)).distance;
			}
			return 17f;
		}

		private float GetLadderRotationDegrees(float topOfLadder)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: 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_0066: 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_008e: 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)
			float num = 90f;
			for (float num2 = 21f; num2 >= 8f; num2 -= 1f)
			{
				float num3 = 0.81f * num2;
				((Component)moveableNode).transform.localPosition = new Vector3(0f, num3, 0f);
				baseNode.localEulerAngles = Vector3.zero;
				for (int i = 1; i < 40; i++)
				{
					Vector3 position = ((Component)moveableNode).transform.position;
					baseNode.localEulerAngles = new Vector3((float)(-i / 2) * 4.5f, 0f, 0f);
					if (Physics.Linecast(position, ((Component)moveableNode).transform.position, layerMask, (QueryTriggerInteraction)1))
					{
						float num4 = (float)(i / 2 - 1) * 4.5f;
						if (num4 < num)
						{
							num = num4;
						}
						break;
					}
				}
				if (num <= 8f)
				{
					break;
				}
			}
			return 0f - num;
		}

		public override void DiscardItem()
		{
			((GrabbableObject)this).DiscardItem();
		}

		public override void EquipItem()
		{
			((GrabbableObject)this).EquipItem();
		}

		public override void DiscardItemFromEnemy()
		{
			((GrabbableObject)this).DiscardItemFromEnemy();
			ladderActivated = true;
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			//IL_0026: 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)
			((GrabbableObject)this).ItemActivate(used, buttonDown);
			ladderActivated = true;
			if (((NetworkBehaviour)this).IsOwner)
			{
				base.playerHeldBy.DiscardHeldObject(false, (NetworkObject)null, default(Vector3), true);
			}
		}

		protected override void __initializeVariables()
		{
			((GrabbableObject)this).__initializeVariables();
		}

		protected override string __getTypeName()
		{
			return "BigLadderItem";
		}
	}
}