using Godot; using System; using Movementtests.interfaces; [GlobalClass] public partial class FlyingEnemy : CharacterBody3D, IDamageable, IKillable, IKnockbackable { [Export] public Node3D Target { get; set; } [Export] public FlyingEnemyInputs Inputs; private RayCast3D _groundDistanceRaycast; private Area3D _damageBox; private bool _movingToDesiredHeight = true; private Vector3 _randomDirection; public override void _Ready() { _groundDistanceRaycast = GetNode("GroundDistance"); _groundDistanceRaycast.TargetPosition = new Vector3(0, -Inputs.TargetHeight, 0); _damageBox = GetNode("DamageBox"); _damageBox.BodyEntered += OnDamageBoxTriggered; _randomDirection = new Vector3(GD.RandRange(-1, 1), 1, GD.RandRange(-1, 1)).Normalized(); } public void OnDamageBoxTriggered(Node3D body) { if(body is IDamageable damageable) damageable.TakeDamage(); } public override void _PhysicsProcess(double delta) { var target = Target.GlobalPosition; var direction = (target - GlobalPosition).Normalized(); Vector3 velocity = Velocity; var targetPlane = new Vector3(target.X, GlobalPosition.Y, target.Z); LookAt(targetPlane); // Check if we have a direct line of sight to the player if (!_movingToDesiredHeight) { velocity = direction * Inputs.Speed; var spaceState = GetWorld3D().DirectSpaceState; var query = PhysicsRayQueryParameters3D.Create(GlobalPosition, target, _groundDistanceRaycast.CollisionMask); var result = spaceState.IntersectRay(query); if (result.Count > 0) { _movingToDesiredHeight = true; _randomDirection = new Vector3(GD.RandRange(-1, 1), 1, GD.RandRange(-1, 1)).Normalized(); } } else { velocity = _randomDirection * Inputs.Speed; if (!_groundDistanceRaycast.IsColliding()) { velocity.Y = 0; var spaceState = GetWorld3D().DirectSpaceState; var query = PhysicsRayQueryParameters3D.Create(GlobalPosition, target, _groundDistanceRaycast.CollisionMask); var result = spaceState.IntersectRay(query); if (result.Count == 0) { _movingToDesiredHeight = false; } } } Velocity = velocity; MoveAndSlide(); } public void TakeDamage() { GD.Print("Oh no I'm falling"); } }