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, clickLocation, Quaternion.identity); return clickLocation; } else { StartCoroutine(WhipSmack(collisionGameObject, clickLocation)); } } return null; } else { Destroy(currentHook); ropeExists = false; return null; } } private IEnumerator WhipSmack(GameObject collisionGameObject, Vector2 clickLocation) { currentHook = Instantiate(hookNoSwing, clickLocation, Quaternion.identity); collisionGameObject.GetComponent().TakeDamage(player.GetComponent().damage); yield return new WaitForSeconds(0.1f); Destroy(currentHook); ropeExists = false; } } }