Fix up projectiles

This commit is contained in:
2026-02-24 12:28:01 -08:00
parent 846c8a4c59
commit 9d18bbb349
23 changed files with 261 additions and 210 deletions

View File

@@ -0,0 +1,77 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using Zennysoft.Game.Ma;
using Zennysoft.Ma.Adapter;
using Zennysoft.Ma.Adapter.Entity;
[Meta(typeof(IAutoNode))]
public partial class EnemyProjectile : Node3D
{
public override void _Notification(int what) => this.Notify(what);
[Dependency] protected IMap _map => this.DependOn<IMap>();
[Dependency] protected IPlayer _player => this.DependOn<IPlayer>();
[Node] public Area3D ProjectileHitbox { get; set; }
[Node] public AnimationPlayer AnimationPlayer { get; set; }
[Export] public AttackDataResource AttackData { get; set; }
public void OnReady()
{
ProjectileHitbox.AreaEntered += Hitbox_AreaEntered;
ProjectileHitbox.BodyEntered += ProjectileHitbox_BodyEntered1;
ProjectileHitbox.BodyShapeEntered += ProjectileHitbox_BodyEntered;
AnimationPlayer.AnimationFinished += AnimationPlayer_AnimationFinished;
AnimationPlayer.Play("RESET");
}
private void AnimationPlayer_AnimationFinished(StringName animName)
{
if (animName != "Fire")
return;
ProjectileHitbox.SetDeferred(Area3D.PropertyName.Monitorable, false);
ProjectileHitbox.SetDeferred(Area3D.PropertyName.Monitoring, false);
AnimationPlayer.Stop();
AnimationPlayer.Play("RESET");
}
private void ProjectileHitbox_BodyEntered1(Node3D body)
{
ProjectileHitbox.SetDeferred(Area3D.PropertyName.Monitorable, false);
ProjectileHitbox.SetDeferred(Area3D.PropertyName.Monitoring, false);
AnimationPlayer.Stop();
AnimationPlayer.Play("RESET");
}
private void ProjectileHitbox_BodyEntered(Rid bodyRid, Node3D body, long bodyShapeIndex, long localShapeIndex)
{
AnimationPlayer.Stop();
AnimationPlayer.Play("RESET");
}
public bool Fire()
{
if (AnimationPlayer.IsPlaying())
return false;
GlobalBasis = GetOwner<IEnemyModelView>().GetOwner<IEnemy>().GlobalBasis;
ProjectileHitbox.SetDeferred(Area3D.PropertyName.Monitorable, true);
ProjectileHitbox.SetDeferred(Area3D.PropertyName.Monitoring, true);
AnimationPlayer.Play("Fire");
return true;
}
private void Hitbox_AreaEntered(Area3D area)
{
if (area.GetOwner() is IPlayer player)
player.TakeDamage(new AttackData(AttackData.Damage, AttackData.ElementType));
ProjectileHitbox.SetDeferred(Area3D.PropertyName.Monitorable, false);
ProjectileHitbox.SetDeferred(Area3D.PropertyName.Monitoring, false);
AnimationPlayer.Stop();
AnimationPlayer.Play("RESET");
}
}