80 lines
1.6 KiB
C#
80 lines
1.6 KiB
C#
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<Area3D>("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();
|
|
}
|
|
}
|