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";
}
}
}