using Godot; using System; public partial class Spawner : Node3D { [Export(PropertyHint.NodeType)] public PackedScene EnemyToSpawn { get; set; } [Export] public RMovement MovementInputs { get; set; } [Export] public RHealth HealthInputs { get; set; } [Export] public RDamage DamageInputs { get; set; } [Export] public Node3D Target { get; set; } [Export(PropertyHint.Range, "0.1, 100, 0.1, or_greater")] public float SpawnInterval { get; set; } = 1.0f; [Export] public bool IsActiveOnStart { get; set; } = true; private float _spawnTimer; private bool _isActive; public override void _Ready() { _isActive = IsActiveOnStart; _spawnTimer = SpawnInterval; } public override void _Process(double delta) { if (!_isActive) return; _spawnTimer -= (float) delta; if (_spawnTimer <= 0) Spawn(); } public void Spawn() { if (EnemyToSpawn == null || !EnemyToSpawn.CanInstantiate()) return; if (EnemyToSpawn.Instantiate() is not Enemy spawnedInstance) return; spawnedInstance.Target = Target; spawnedInstance.RMovement = MovementInputs; spawnedInstance.RDamage = DamageInputs; spawnedInstance.RHealth = HealthInputs; spawnedInstance.Initialize(); GetTree().GetCurrentScene().AddChild(spawnedInstance); spawnedInstance.GlobalPosition = GlobalPosition; _spawnTimer = SpawnInterval; } public void StartSpawning() { _isActive = true; _spawnTimer = SpawnInterval; } public void StopSpawning() { _isActive = false; } }