diff options
Diffstat (limited to 'Assets/Scripts/Items/Whip.cs')
-rw-r--r-- | Assets/Scripts/Items/Whip.cs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/Assets/Scripts/Items/Whip.cs b/Assets/Scripts/Items/Whip.cs new file mode 100644 index 0000000..b482f8d --- /dev/null +++ b/Assets/Scripts/Items/Whip.cs @@ -0,0 +1,73 @@ +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<AudioManager>().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<Actor>().TakeDamage(player.GetComponent<Player>().stats.damage); + FindObjectOfType<AudioManager>().Play("WhipSwoosh"); + yield return new WaitForSeconds(0.1f); + Destroy(currentHook); + ropeExists = false; + } + } +}
\ No newline at end of file |