using Godot; using Movementtests.interfaces; [GlobalClass] public partial class Enemy : CharacterBody3D, IDamageable, IDamageMaker, IHealthable, IKillable { [Export] public Node3D Target { get; set; } [Export] public RDamage GetDamageDealt { get; set; } [Export] public CHealth CHealth { get; set; } [Export] public CDamageable CDamage { get; set; } [Export] public Node CMovement { get; set; } [Export] public RDeathEffect[] DeathEffects { get; set; } private Area3D _damageBox; public override void _Ready() { _damageBox = GetNode("DamageBox"); _damageBox.BodyEntered += OnDamageBoxTriggered; CDamage.DamageTaken += ReduceHealth; CHealth.Dead += Kill; } public override void _PhysicsProcess(double delta) { var targetPlanar = new Vector3(Target.GlobalPosition.X, GlobalPosition.Y, Target.GlobalPosition.Z); LookAt(targetPlanar); if (CMovement is not IMoveable movement) return; var inputs = new MovementInputs( Velocity: Velocity, TargetLocation: Target.GlobalPosition, isOnFloor: IsOnFloor(), gravity: GetGravity(), delta: delta ); Velocity = movement!.ComputeVelocity(inputs); MoveAndSlide(); } public void OnDamageBoxTriggered(Node3D body) { GD.Print("Take this!"); if(body is IDamageable damageable) damageable.TakeDamage(GetDamageDealt); } public float TakeDamage(RDamage damage) { GD.Print("Ouch!"); return CDamage.TakeDamage(damage); } public void ReduceHealth(float amount) { CHealth.ReduceHealth(amount); } public void Kill() { foreach (var killable in DeathEffects.ToIKillables()) { killable.Kill(); } QueueFree(); } }