using System.Collections; using Sonigon; using UnityEngine; public class WeaponHandler : MonoBehaviour { [Header("Sounds")] public SoundEvent soundCharacterCantShoot; private bool soundFireHold; [Header("Settings")] public Gun gun; private Holding holding; private GeneralInput input; private CharacterData data; private float heatSinceAttack; private float heat; public float heatPerBullet = 0.1f; public float secondsBeforeStartToCool = 0.1f; public float coolPerSecond = 0.2f; public float overHeatTime = 1f; public float resetSpeed = 2f; public bool isOverHeated; private bool hasBeenHeated; public SpriteRenderer heatRenderer; private Transform overHeatPivot; public Color overHeatColor; private Color baseHeatColor; internal void DoReload() { gun.GetComponentInChildren().ReloadAmmo(); } private void Awake() { holding = GetComponent(); input = GetComponent(); data = GetComponent(); } private void Start() { overHeatPivot = heatRenderer.transform.parent; baseHeatColor = heatRenderer.color; } private void Update() { if (!gun.holdable.holder && (bool)data) { gun.holdable.holder = data; } if (data.playerVel.simulated) { gun.attackSpeedMultiplier = data.stats.attackSpeedMultiplier; heatSinceAttack += TimeHandler.deltaTime; Attack(); OverHeat(); } } private void Attack() { if (!gun || !gun.IsReady()) { return; } if (input.shootIsPressed) { if (!soundFireHold) { soundFireHold = true; if (gun.isReloading || data.isSilenced) { SoundManager.Instance.Play(soundCharacterCantShoot, base.transform); } } } else { soundFireHold = false; } if (gun.bursts == 0 && (!soundFireHold || gun.isReloading || data.isSilenced)) { gun.soundGun.StopAutoPlayTail(); } if ((!input.shootWasPressed || gun.useCharge) && (!input.shootWasReleased || !gun.useCharge) && (!(gun.attackSpeed / data.stats.attackSpeedMultiplier < 0.3f) || !input.shootIsPressed || gun.useCharge || gun.dontAllowAutoFire)) { return; } if (isOverHeated) { heatRenderer.GetComponent().PlayBoop(); gun.sinceAttack = 0f; return; } gun.Attack(0f); if (heat >= 1f) { StartCoroutine(DoOverHeat()); isOverHeated = true; } heatSinceAttack = 0f; } internal void NewGun() { gun.ResetStats(); gun.soundGun.ClearSoundModifiers(); } private void OverHeat() { if (!isOverHeated) { if (heatSinceAttack > secondsBeforeStartToCool) { heat -= TimeHandler.deltaTime * coolPerSecond; } SetOverHeatColor(); } } private IEnumerator DoOverHeat() { SetOverHeatColor(); yield return new WaitForSeconds(overHeatTime); while (heat > 0f) { heat -= resetSpeed * TimeHandler.deltaTime; SetOverHeatColor(); yield return null; } isOverHeated = false; } private void SetOverHeatColor() { heat = Mathf.Clamp(heat, 0f, 1f); heatRenderer.color = Color.Lerp(baseHeatColor, overHeatColor, heat); if (heat > 0.25f || hasBeenHeated) { hasBeenHeated = true; overHeatPivot.transform.localScale = new Vector3(heat, 1f, 1f); } else { overHeatPivot.transform.localScale = new Vector3(0f, 1f, 1f); } if (heat == 0f) { hasBeenHeated = false; } } }