using Godot; using System; using System.Collections.Generic; using System.Linq; using fgj26.Scripts.Common; using fgj26.Scripts.Helpers; public partial class Turret : Node { [Export] private Area2D _Attackrange; [Export] private float _fireRate; [Export] private Node2D _parent; [Export] private ProjectilePool _projectilePool; [Export] private AudioStreamPlayer2D _audio; private float _fireTimer = 0f; private HashSet _enemiesInRange = new HashSet(); public override void _EnterTree() { _Attackrange.AreaEntered += EnemyEntered; _Attackrange.AreaExited += EnemyExited; } private void EnemyEntered(Area2D enemyHitBox) { if (enemyHitBox is EnemyArea earea) { _enemiesInRange.Add(earea.Enemy); } } private void EnemyExited(Area2D enemyHitBox) { if (enemyHitBox is EnemyArea earea) { _enemiesInRange.Remove(earea.Enemy); } } public override void _Process(double delta) { if (_enemiesInRange.Count == 0) return; _fireTimer += (float)delta; if (!(_fireTimer >= 1f / _fireRate)) return; _fireTimer = 0; _audio?.SetPitchScale(RandomHelper.Float(0.8f, 1.2f)); _audio?.Play(); var t = Helpers.GetClosest(_parent,_enemiesInRange.ToArray()); var dir = (t.GlobalPosition - _parent.GlobalPosition).Normalized(); var proj = _projectilePool.Get(); proj.Direction = dir; proj.GlobalPosition = _parent.GlobalPosition; proj.Rotation = dir.Angle(); ProjectileParent.Instance.AddChild(proj); } }