295 lines
8.1 KiB
C#
295 lines
8.1 KiB
C#
|
using System.Collections;
|
||
|
using UnityEngine;
|
||
|
|
||
|
public class ExtensionLadderItem : GrabbableObject
|
||
|
{
|
||
|
private bool ladderActivated;
|
||
|
|
||
|
private bool ladderAnimationBegun;
|
||
|
|
||
|
private Coroutine ladderAnimationCoroutine;
|
||
|
|
||
|
public Animator ladderAnimator;
|
||
|
|
||
|
public Animator ladderRotateAnimator;
|
||
|
|
||
|
public Transform baseNode;
|
||
|
|
||
|
public Transform topNode;
|
||
|
|
||
|
public Transform moveableNode;
|
||
|
|
||
|
private RaycastHit hit;
|
||
|
|
||
|
private int layerMask = 268437761;
|
||
|
|
||
|
public AudioClip hitRoof;
|
||
|
|
||
|
public AudioClip fullExtend;
|
||
|
|
||
|
public AudioClip hitWall;
|
||
|
|
||
|
public AudioClip ladderExtendSFX;
|
||
|
|
||
|
public AudioClip ladderFallSFX;
|
||
|
|
||
|
public AudioClip ladderShrinkSFX;
|
||
|
|
||
|
public AudioClip blinkWarningSFX;
|
||
|
|
||
|
public AudioClip lidOpenSFX;
|
||
|
|
||
|
public AudioSource ladderAudio;
|
||
|
|
||
|
public InteractTrigger ladderScript;
|
||
|
|
||
|
private float rotateAmount;
|
||
|
|
||
|
private float extendAmount;
|
||
|
|
||
|
private float ladderTimer;
|
||
|
|
||
|
private bool ladderBlinkWarning;
|
||
|
|
||
|
private bool ladderShrunkAutomatically;
|
||
|
|
||
|
public Collider interactCollider;
|
||
|
|
||
|
public Collider bridgeCollider;
|
||
|
|
||
|
public Collider killTrigger;
|
||
|
|
||
|
public override void Update()
|
||
|
{
|
||
|
base.Update();
|
||
|
if (playerHeldBy == null && !isHeld && reachedFloorTarget && ladderActivated)
|
||
|
{
|
||
|
if (!ladderAnimationBegun)
|
||
|
{
|
||
|
ladderTimer = 0f;
|
||
|
StartLadderAnimation();
|
||
|
}
|
||
|
else if (ladderAnimationBegun)
|
||
|
{
|
||
|
ladderTimer += Time.deltaTime;
|
||
|
if (!ladderBlinkWarning && ladderTimer > 15f)
|
||
|
{
|
||
|
ladderBlinkWarning = true;
|
||
|
ladderAnimator.SetBool("blinkWarning", value: true);
|
||
|
ladderAudio.clip = blinkWarningSFX;
|
||
|
ladderAudio.Play();
|
||
|
}
|
||
|
else if (ladderTimer >= 20f)
|
||
|
{
|
||
|
ladderActivated = false;
|
||
|
ladderBlinkWarning = false;
|
||
|
ladderAudio.Stop();
|
||
|
ladderAnimator.SetBool("blinkWarning", value: false);
|
||
|
}
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
if (ladderAnimationBegun)
|
||
|
{
|
||
|
ladderAnimationBegun = false;
|
||
|
ladderAudio.Stop();
|
||
|
killTrigger.enabled = false;
|
||
|
bridgeCollider.enabled = false;
|
||
|
interactCollider.enabled = false;
|
||
|
if (ladderAnimationCoroutine != null)
|
||
|
{
|
||
|
StopCoroutine(ladderAnimationCoroutine);
|
||
|
}
|
||
|
ladderAnimator.SetBool("blinkWarning", value: false);
|
||
|
ladderAudio.transform.position = base.transform.position;
|
||
|
ladderAudio.PlayOneShot(ladderShrinkSFX);
|
||
|
ladderActivated = false;
|
||
|
}
|
||
|
ladderScript.interactable = false;
|
||
|
if (GameNetworkManager.Instance.localPlayerController != null && GameNetworkManager.Instance.localPlayerController.currentTriggerInAnimationWith == ladderScript)
|
||
|
{
|
||
|
ladderScript.CancelAnimationExternally();
|
||
|
}
|
||
|
if (rotateAmount > 0f)
|
||
|
{
|
||
|
rotateAmount = Mathf.Max(rotateAmount - Time.deltaTime * 2f, 0f);
|
||
|
ladderRotateAnimator.SetFloat("rotationAmount", rotateAmount);
|
||
|
}
|
||
|
if (extendAmount > 0f)
|
||
|
{
|
||
|
extendAmount = Mathf.Max(extendAmount - Time.deltaTime * 2f, 0f);
|
||
|
ladderAnimator.SetFloat("extensionAmount", extendAmount);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ladderAnimator.SetBool("openLid", value: false);
|
||
|
ladderAnimator.SetBool("extend", value: false);
|
||
|
ladderAnimator.SetFloat("extensionAmount", 0f);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void StartLadderAnimation()
|
||
|
{
|
||
|
ladderAnimationBegun = true;
|
||
|
ladderScript.interactable = false;
|
||
|
if (ladderAnimationCoroutine != null)
|
||
|
{
|
||
|
StopCoroutine(ladderAnimationCoroutine);
|
||
|
}
|
||
|
ladderAnimationCoroutine = StartCoroutine(LadderAnimation());
|
||
|
}
|
||
|
|
||
|
private IEnumerator LadderAnimation()
|
||
|
{
|
||
|
ladderAudio.volume = 1f;
|
||
|
ladderScript.interactable = false;
|
||
|
interactCollider.enabled = false;
|
||
|
bridgeCollider.enabled = false;
|
||
|
killTrigger.enabled = false;
|
||
|
ladderAnimator.SetBool("openLid", value: false);
|
||
|
ladderAnimator.SetBool("extend", value: false);
|
||
|
yield return null;
|
||
|
ladderAnimator.SetBool("openLid", value: true);
|
||
|
ladderAudio.transform.position = base.transform.position;
|
||
|
ladderAudio.PlayOneShot(lidOpenSFX, 1f);
|
||
|
RoundManager.Instance.PlayAudibleNoise(ladderAudio.transform.position, 18f, 0.8f, 0, isInShipRoom);
|
||
|
yield return new WaitForSeconds(1f);
|
||
|
ladderAnimator.SetBool("extend", value: true);
|
||
|
float ladderExtendAmountNormalized = GetLadderExtensionDistance() / 9.72f;
|
||
|
float ladderRotateAmountNormalized = Mathf.Clamp(GetLadderRotationDegrees(ladderExtendAmountNormalized) / -90f, 0f, 0.99f);
|
||
|
ladderAudio.clip = ladderExtendSFX;
|
||
|
ladderAudio.Play();
|
||
|
float currentNormalizedTime2 = 0f;
|
||
|
float speedMultiplier2 = 0.1f;
|
||
|
while (currentNormalizedTime2 < ladderExtendAmountNormalized)
|
||
|
{
|
||
|
speedMultiplier2 += Time.deltaTime * 2f;
|
||
|
currentNormalizedTime2 = Mathf.Min(currentNormalizedTime2 + Time.deltaTime * speedMultiplier2, ladderExtendAmountNormalized);
|
||
|
ladderAnimator.SetFloat("extensionAmount", currentNormalizedTime2);
|
||
|
yield return null;
|
||
|
}
|
||
|
extendAmount = currentNormalizedTime2;
|
||
|
interactCollider.enabled = true;
|
||
|
bridgeCollider.enabled = false;
|
||
|
killTrigger.enabled = false;
|
||
|
ladderAudio.Stop();
|
||
|
if (ladderExtendAmountNormalized == 1f)
|
||
|
{
|
||
|
ladderAudio.transform.position = baseNode.transform.position + baseNode.transform.up * 9.72f;
|
||
|
ladderAudio.PlayOneShot(fullExtend, 0.7f);
|
||
|
WalkieTalkie.TransmitOneShotAudio(ladderAudio, fullExtend, 0.7f);
|
||
|
RoundManager.Instance.PlayAudibleNoise(ladderAudio.transform.position, 8f, 0.5f, 0, isInShipRoom);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ladderAudio.transform.position = baseNode.transform.position + baseNode.transform.up * (ladderExtendAmountNormalized * 9.72f);
|
||
|
ladderAudio.PlayOneShot(hitRoof);
|
||
|
WalkieTalkie.TransmitOneShotAudio(ladderAudio, hitRoof);
|
||
|
RoundManager.Instance.PlayAudibleNoise(ladderAudio.transform.position, 17f, 0.8f, 0, isInShipRoom);
|
||
|
}
|
||
|
yield return new WaitForSeconds(0.4f);
|
||
|
ladderAudio.clip = ladderFallSFX;
|
||
|
ladderAudio.Play();
|
||
|
ladderAudio.volume = 0f;
|
||
|
speedMultiplier2 = 0.15f;
|
||
|
currentNormalizedTime2 = 0f;
|
||
|
while (currentNormalizedTime2 < ladderRotateAmountNormalized)
|
||
|
{
|
||
|
speedMultiplier2 += Time.deltaTime * 2f;
|
||
|
currentNormalizedTime2 = Mathf.Min(currentNormalizedTime2 + Time.deltaTime * speedMultiplier2, ladderRotateAmountNormalized);
|
||
|
if (ladderExtendAmountNormalized > 0.6f && currentNormalizedTime2 > 0.5f)
|
||
|
{
|
||
|
killTrigger.enabled = true;
|
||
|
}
|
||
|
ladderAudio.volume = Mathf.Min(ladderAudio.volume + Time.deltaTime * 1.75f, 1f);
|
||
|
ladderRotateAnimator.SetFloat("rotationAmount", currentNormalizedTime2);
|
||
|
yield return null;
|
||
|
}
|
||
|
rotateAmount = ladderRotateAmountNormalized;
|
||
|
ladderAudio.volume = 1f;
|
||
|
ladderAudio.Stop();
|
||
|
ladderAudio.transform.position = moveableNode.transform.position;
|
||
|
ladderAudio.PlayOneShot(hitWall, Mathf.Min(ladderRotateAmountNormalized + 0.3f, 1f));
|
||
|
RoundManager.Instance.PlayAudibleNoise(ladderAudio.transform.position, 18f, 0.7f, 0, isInShipRoom);
|
||
|
if (ladderRotateAmountNormalized * 90f < 45f)
|
||
|
{
|
||
|
ladderScript.interactable = true;
|
||
|
interactCollider.enabled = true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
bridgeCollider.enabled = true;
|
||
|
}
|
||
|
killTrigger.enabled = false;
|
||
|
}
|
||
|
|
||
|
private float GetLadderExtensionDistance()
|
||
|
{
|
||
|
if (Physics.Raycast(baseNode.transform.position, Vector3.up, out hit, 9.72f, layerMask, QueryTriggerInteraction.Ignore))
|
||
|
{
|
||
|
return hit.distance;
|
||
|
}
|
||
|
return 9.72f;
|
||
|
}
|
||
|
|
||
|
private float GetLadderRotationDegrees(float topOfLadder)
|
||
|
{
|
||
|
float num = 90f;
|
||
|
for (int num2 = 4; num2 >= 1; num2--)
|
||
|
{
|
||
|
float y = 2.43f * (float)num2;
|
||
|
moveableNode.transform.localPosition = new Vector3(0f, y, 0f);
|
||
|
baseNode.localEulerAngles = Vector3.zero;
|
||
|
for (int i = 1; i < 20; i++)
|
||
|
{
|
||
|
Vector3 position = moveableNode.transform.position;
|
||
|
baseNode.localEulerAngles = new Vector3((float)(-i) * 4.5f, 0f, 0f);
|
||
|
if (Physics.Linecast(position, moveableNode.transform.position, layerMask, QueryTriggerInteraction.Ignore))
|
||
|
{
|
||
|
float num3 = (float)(i - 1) * 4.5f;
|
||
|
if (num3 < num)
|
||
|
{
|
||
|
num = num3;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (num < 12f)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return 0f - num;
|
||
|
}
|
||
|
|
||
|
public override void DiscardItem()
|
||
|
{
|
||
|
base.DiscardItem();
|
||
|
}
|
||
|
|
||
|
public override void EquipItem()
|
||
|
{
|
||
|
base.EquipItem();
|
||
|
}
|
||
|
|
||
|
public override void ItemActivate(bool used, bool buttonDown = true)
|
||
|
{
|
||
|
base.ItemActivate(used, buttonDown);
|
||
|
ladderActivated = true;
|
||
|
if (base.IsOwner)
|
||
|
{
|
||
|
playerHeldBy.DiscardHeldObject();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected override void __initializeVariables()
|
||
|
{
|
||
|
base.__initializeVariables();
|
||
|
}
|
||
|
|
||
|
protected internal override string __getTypeName()
|
||
|
{
|
||
|
return "ExtensionLadderItem";
|
||
|
}
|
||
|
}
|