using System; using System.Collections.Generic; using UnityEngine; public class AirDropManager : MonoBehaviour { public static event Action AccuracyUpdated; [SerializeField] InSignal airdropRequestButton = InSignal.UpLeft; [SerializeField] int hitsCount; public static float Accuracy { get; private set; } public static float RequiredAccuracy => instance.GetRequiredAccuracy(); private static AirDropManager instance; private int airdropsPerformed = 0; [SerializeField] List accuracyToAirdropList; private GameObject playerGO; private int totalAmmo; [SerializeField] BezierWay airdropWay; [SerializeField] Drone dronePrefab; [SerializeField] Transform droneSpawnPoint; [SerializeField] AudioClip launchSound; public bool AirdropOnTheWay { get; private set; } public void Init(GameObject player) { instance = this; playerGO = player; hitsCount = 0; AirdropOnTheWay = false; totalAmmo = 0; var weapons = G.WeaponModel.Weapons; foreach (var weapon in weapons) { totalAmmo += weapon.MaxAmmo; } Damager.OnCollideHitbox += OnProjectileHit; AmmoBox.OnAmmoBoxConsumed += OnAirdropConsumed; } private void OnDestroy() { Damager.OnCollideHitbox -= OnProjectileHit; AmmoBox.OnAmmoBoxConsumed -= OnAirdropConsumed; } private float GetRequiredAccuracy() { int index = Mathf.Min(airdropsPerformed, accuracyToAirdropList.Count-1); float accuracy = accuracyToAirdropList[index]; return Mathf.Clamp01(accuracy); } private void OnProjectileHit(GameObject damagerOwner, GameObject hitboxOwner) { bool shootByPlayer = damagerOwner == playerGO; bool hitToEnemy = hitboxOwner.TryGetComponent(out _); if (shootByPlayer && hitToEnemy) { hitsCount++; UpdateAccuracy(); } } private void OnAirdropConsumed() { AirdropOnTheWay = false; hitsCount = 0; UpdateAccuracy(); } private void UpdateAccuracy() { Accuracy = totalAmmo > 0 ? (float)hitsCount / totalAmmo : 0f; float requiredAccuracy = GetRequiredAccuracy(); bool canDrop = Accuracy >= requiredAccuracy; AccuracyUpdated?.Invoke(Accuracy, canDrop); } private void Update() { if (In.GetButtonDown(airdropRequestButton)) { LaunchDrone(); } } private void LaunchDrone() { if (AirdropOnTheWay) return; if (Accuracy < GetRequiredAccuracy()) return; SoundManager.PlayReplica(launchSound); var go = Instantiate(dronePrefab, droneSpawnPoint.position, Quaternion.identity); var drone = go.GetComponent(); drone.Init(airdropWay); airdropsPerformed++; //AccuracyUpdated?.Invoke(Accuracy, false); AirdropOnTheWay = true; } }