using System.Collections; using System.Collections.Generic; using UnityEngine; public class Water : ActiveBlock { [Header("Water Settings")] [SerializeField] [Tooltip("GameObject which appears when character respawns")] private GameObject lillyPad; [SerializeField] [Tooltip("Distance character will be submerged into the water")] private float FallDistance = 0.5f; [SerializeField] private bool lillyPadStartUp = false; private bool isLillyPadUp = false; private Character trappedCharacter; public override int GetInitative() { return 0; } private void Start() { if (lillyPadStartUp) { StartCoroutine(LerpToPosition(lillyPad.transform, VisualPosition, 0)); isLillyPadUp = true; } } public override IEnumerator OnWalkedOnByPlayer(Character player, Vector3 moveDirection) { yield return StartCoroutine(base.OnWalkedOnByPlayer(player, moveDirection)); if (trappedCharacter == null && !isLillyPadUp) { CurrentPlayer = null; trappedCharacter = player; trappedCharacter.stuck = true; trappedCharacter.StartAnimation(Character.Animation.Hit); yield return StartCoroutine(LerpToPosition(trappedCharacter.transform, VisualPosition + Vector3.down * FallDistance, 1)); } } public override void OnLeftByPlayer(Character player) { base.OnLeftByPlayer(player); if (isLillyPadUp && CurrentPlayer == null) { StartCoroutine(LerpToPosition(lillyPad.transform, VisualPosition + Vector3.down * FallDistance, 1)); isLillyPadUp = false; } } public override IEnumerator OnRoundEnd(PlayerData[] allPlayers) { if (trappedCharacter != null) { //if character is on an angle undo their last rotation if (trappedCharacter.transform.eulerAngles.y % 90 > 10 && trappedCharacter.transform.eulerAngles.y % 90 < 80) { trappedCharacter.transform.Rotate(Vector3.up, -trappedCharacter.lastRotation); trappedCharacter.lastRotation = 0; //if they are still on an angle fix to the closest rotation if (trappedCharacter.transform.eulerAngles.y % 90 != 0) { Vector3 newRot = trappedCharacter.transform.eulerAngles; newRot.y = Mathf.Round(newRot.y / 90) * 90; trappedCharacter.transform.eulerAngles = newRot; } } StartCoroutine(LerpToPosition(trappedCharacter.transform, VisualPosition, 1)); StartCoroutine(LerpToPosition(lillyPad.transform, VisualPosition, 1)); if (CurrentPlayer != null) { yield return new WaitForSeconds(0.2f); yield return StartCoroutine(PushPlayOnTop()); } else { yield return new WaitForSeconds(1); CurrentPlayer = trappedCharacter; } trappedCharacter.stuck = false; isLillyPadUp = true; trappedCharacter = null; } isFinished = true; } private IEnumerator PushPlayOnTop() { Direction[] possibleDirections = DirectionExtras.RandomOrder(); for (int i = 0; i < 4; i++) { if (Block.isBlockAtPosition(position + possibleDirections[i].ToVector() + Vector3.up, 1, ~0)) continue; yield return StartCoroutine(DoPush(trappedCharacter, possibleDirections[i].ToVector())); break; } } private IEnumerator LerpToPosition(Transform target, Vector3 endPos, float time) { Vector3 _startPos = target.position; float elapsedTime = 0; while (elapsedTime / time < 1) { target.position = Vector3.Lerp(_startPos, endPos, (elapsedTime / time)); yield return new WaitForEndOfFrame(); elapsedTime += Time.deltaTime; } target.position = endPos; } }