enemy grant hit ability + prep projectiles

This commit is contained in:
2026-05-06 19:55:05 +02:00
parent 7ba4a3db3f
commit 01a2e7582b
19 changed files with 390 additions and 64 deletions

View File

@@ -8,6 +8,7 @@ using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Cues;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Events;
using Gamesmiths.Forge.Godot.Resources;
using Gamesmiths.Forge.Godot.Resources.Abilities;
using Gamesmiths.Forge.Statescript;
using Gamesmiths.Forge.Tags;
@@ -44,7 +45,6 @@ public partial class Enemy : CharacterBody3D,
// Public export components
[Export]
public Node3D? Target { get; set; }
[Export] public required ForgeAbilityData HitAbility { get; set; }
[Export]
public float EnemyHeight { get; set; } = 1f;
[Export]
@@ -108,7 +108,6 @@ public partial class Enemy : CharacterBody3D,
public void OnReady()
{
Init();
SetupSignals();
}
public void Init()
@@ -118,7 +117,7 @@ public partial class Enemy : CharacterBody3D,
CKnockback = GetNode<Node>("CKnockback") as IKnockbackable ?? throw new Exception("Knockback component not found");
CKnockback.RKnockback = RKnockback;
_hitAbilityHandle = Abilities.GrantAbilityPermanently(HitAbility.GetAbilityData(), 1, LevelComparison.None, this);
// _hitAbilityHandle = Abilities.GrantAbilityPermanently(HitAbility.GetAbilityData(), 1, LevelComparison.None, this);
}
public void OnResolved()
@@ -132,16 +131,19 @@ public partial class Enemy : CharacterBody3D,
Events.Subscribe<DamageDone>(Tag.RequestTag(TagsManager, "events.combat.damage"), OnDamageReceived);
Events.Subscribe<KnockbackDone>(Tag.RequestTag(TagsManager, "events.combat.knockback_received"), OnKnockbackReceived);
Events.Subscribe(Tag.RequestTag(TagsManager, "events.combat.death"), OnDeath);
GetTree().CreateTimer(3).Timeout += () => Events.Raise(new EventData
{
EventTags = Tag.RequestTag(TagsManager, "events.enemy.launch_projectile").GetSingleTagContainer()!,
Source = this,
Target = Target as IForgeEntity
});
}
public void OnKnockbackReceived(EventData<KnockbackDone> data)
{
RegisterKnockback(new KnockbackRecord(data.Payload.knockbackDirection, data.EventMagnitude));
}
public void SetupSignals()
{
}
public override void _PhysicsProcess(double delta)
{
@@ -165,16 +167,18 @@ public partial class Enemy : CharacterBody3D,
public void ProcessGameplay(double delta)
{
if (_hitAbilityHandle == null) return;
// if (_hitAbilityHandle == null) return;
var bodies = DamageBox.GetOverlappingBodies();
foreach (var body in bodies)
{
if (body is not IForgeEntity forgeEntity) continue;
var canActivate = _hitAbilityHandle.CanActivate(out var _);
if (!canActivate) return;
_hitAbilityHandle.Activate(out var _, forgeEntity);
Events.Raise(new EventData
{
EventTags = Tag.RequestTag(TagsManager, "events.enemy.try_hit").GetSingleTagContainer()!,
Source = this,
Target = forgeEntity
});
}
}