made explosion forge compliant

This commit is contained in:
2026-05-05 10:55:12 +02:00
parent a139990390
commit 33f55d04f3
10 changed files with 223 additions and 35 deletions

View File

@@ -1,22 +1,42 @@
using Godot;
using System;
using System.Linq;
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Cues;
using Gamesmiths.Forge.Tags;
using Movementtests.interfaces;
using Movementtests.tools;
[GlobalClass, Icon("res://assets/ui/IconGodotNode/node_3D/icon_projectile.png")]
public partial class Explosion : Area3D, IDamageDealer
[GlobalClass, Icon("res://assets/ui/IconGodotNode/node_3D/icon_projectile.png"), Meta(typeof(IAutoNode))]
public partial class Explosion : Area3D, IDamageDealer, IProvide<CuesManager>
{
[Export] public RDamage RDamage { get; set;}
[Export] public float Radius { get; set;}
public override void _Notification(int what) => this.Notify(what);
[Dependency]
public CuesManager CuesManager => this.DependOn<CuesManager>();
CuesManager IProvide<CuesManager>.Value() => CuesManager;
[Export] public RDamage RDamage { get; set; }
[Export] public float Radius { get; set; } = 1.0f;
[Export] public float ExplosionTime { get; set; } = 0.2f;
public override void _Ready()
[Node("CollisionShape3D")] public required CollisionShape3D CollisionShape { get; set; }
[Node("MeshInstance3D")] public required MeshInstance3D CollisionMesh { get; set; }
[Node("ForgeEntityNode")] public required ForgeEntityNode ForgeEntityNode { get; set; }
public void OnReady()
{
var sphereShape = GetNode<CollisionShape3D>("CollisionShape3D").Shape as SphereShape3D;
sphereShape!.Radius = Radius;
var sphereMesh = GetNode<MeshInstance3D>("MeshInstance3D").Mesh as SphereMesh;
sphereMesh!.Radius = Radius;
sphereMesh!.Height = Radius*2f;
if (CollisionShape.Shape is SphereShape3D sphereShape) sphereShape.Radius = Radius;
if (CollisionMesh.Mesh is not SphereMesh sphereMesh) return;
sphereMesh.Radius = Radius;
sphereMesh.Height = Radius * 2f;
}
public void OnResolved()
{
this.Provide();
GetTree().CreateTimer(ExplosionTime).Timeout += TriggerExplosion;
}
@@ -25,12 +45,10 @@ public partial class Explosion : Area3D, IDamageDealer
var bodies = GetOverlappingBodies();
foreach (var body in bodies)
{
if (body is IDamageable damageable)
damageable.TakeDamage(new DamageRecord(GlobalPosition, RDamage));
if (body is IStunnable stunnable)
stunnable.Stun();
if (body is not IForgeEntity target) continue;
foreach (var ability in ForgeEntityNode.Abilities.GrantedAbilities.Where(ability => ability.CanActivate(out _, target)))
ability.Activate(out _, target, RDamage.DamageDealt);
}
QueueFree();
}
}