using MontanaJohns.Actors; using MontanaJohns.Core; using System.Collections; using UnityEngine; using UnityEngine.InputSystem; namespace MontanaJohns.Items { public class Whip : Active { [SerializeField] protected GameObject hook; [SerializeField] protected GameObject hookNoSwing; [SerializeField] protected float maxRopeLength = 20f; protected GameObject player; protected GameObject currentHook; protected LayerMask ropeLayers; protected bool ropeExists = false; private void Awake() { stats.damage = 1; } private void Start() { player = GameObject.FindGameObjectWithTag("Player"); ropeLayers = LayerMask.GetMask("Grapple", "Enemy"); } public override Vector2? Use() { if (!ropeExists) { Vector2 clickLocation = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue()); Vector2 playerPos = player.transform.position; Vector2 direction = clickLocation - playerPos; RaycastHit2D hit = Physics2D.Raycast(playerPos, direction, maxRopeLength, ropeLayers); if(hit.collider != null) { GameObject collisionGameObject = hit.collider.gameObject; ropeExists = true; if (LayerMask.LayerToName(collisionGameObject.layer) == "Grapple") { currentHook = Instantiate(hook, collisionGameObject.transform.position, Quaternion.identity); FindObjectOfType().Play("WhipSwoosh"); return clickLocation; } else { StartCoroutine(WhipSmack(collisionGameObject)); } } return null; } else { Destroy(currentHook); ropeExists = false; return null; } } private IEnumerator WhipSmack(GameObject collisionGameObject) { currentHook = Instantiate(hookNoSwing, collisionGameObject.transform.position, Quaternion.identity); collisionGameObject.GetComponent().TakeDamage(player.GetComponent().stats.damage); FindObjectOfType().Play("WhipSwoosh"); yield return new WaitForSeconds(0.1f); Destroy(currentHook); ropeExists = false; } } }