ClientServer/Client/Assets/Scripts/Player/ThrowableController.cs

76 lines
2.5 KiB
C#
Raw Normal View History

2025-09-06 17:17:39 +04:00
using System;
using System.Collections;
using UnityEngine;
//Thomas09
public class ThrowableController : MonoBehaviour
{
internal event Action<Weapon> OnThrow;
private Animator anim;
private Weapon throwable;
private Camera playerCamera;
private bool canThrow = false;
[SerializeField] private Transform throwableHolder;
private GameObject throwablePrefab;
private Vector3 grenadeScale = new Vector3(1.5f, 1.5f, 1.5f);
private float refAimVelocity;
private void Awake()
{
throwable = OnDemandLoader.Load<Weapon>("config/" + int.Parse(this.gameObject.name));
throwablePrefab = OnDemandLoader.Load<GameObject>("projectiles/" + throwable.projectile);
playerCamera = Player.Instance.transform.Find("FirstPersonCamera_Holder").GetComponentInChildren<Camera>();
anim = GetComponent<Animator>();
}
private void OnEnable()
{
StartCoroutine(CanThrow());
StartCoroutine(Player.Instance.EquipWeaponCoroutine(throwable, anim));
Player.Instance.GetInputHandler().AimKeyPressed = false;
Player.Instance.GetInputHandler().ToggleAiming = false;
}
private void Update()
{
playerCamera.fieldOfView = Mathf.SmoothDamp(playerCamera.fieldOfView, 60f, ref refAimVelocity, 0.1f);
if (Player.Instance.updatePlayer)
{
if (canThrow && Player.Instance.GetInputHandler().FireKeyPressed)
{
anim.SetBool("ThrowGrenade", true);
}
RunState();
}
CrosshairManager.Instance.SetDynamicCrossHair(0, 0, 0, 0, Player.Instance, WeaponCrosshairType.No_Reticle);
}
private void RunState()
{
anim.SetBool("Run", Player.Instance.CanPlayRunningEvents());
}
private IEnumerator CanThrow()
{
canThrow = false;
yield return new WaitForSeconds(throwable.equipDuration);
canThrow = true;
}
public void Throw() //used in animation event
{
GameObject instantiatedObj = Instantiate(throwablePrefab, throwableHolder.position, Quaternion.identity, null);
Projectile thrownObj = instantiatedObj.GetComponent<Projectile>();
instantiatedObj.transform.localScale = grenadeScale;
thrownObj.rotatable = true;
thrownObj.ownedByMainPlayer = true;
thrownObj.direction = transform.forward;
OnThrow?.Invoke(throwable);
PacketManager.sendThrowItem(transform.forward.x, transform.forward.y, transform.forward.z);
}
}